请教关于STC15W4K串口参数不要起始位的设置方法
void UART3_config(u8 brt) // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer3做波特率.{
u8 i;
/*********** 波特率固定使用定时器2 *****************/
if(brt == 2)
{
S3CON &= ~(1<<6); //BRT select Timer2
SetTimer2Baudraye(65536UL - (MAIN_Fosc / 4) / UART_BaudRate3);
}
/*********** 波特率使用定时器3 *****************/
else
{
S3CON |= (1<<6); //BRT select Timer3
T4T3M &= 0xf0; //停止计数, 清除控制位
IE2&= ~(1<<5); //禁止中断
T4T3M |=(1<<1); //1T
T4T3M &= ~(1<<2); //定时
T4T3M &= ~1; //不输出时钟
TH3 = (65536UL - (MAIN_Fosc / 4) / UART_BaudRate3) / 256;
TL3 = (65536UL - (MAIN_Fosc / 4) / UART_BaudRate3) % 256;
T4T3M |=(1<<3); //开始运行
}
S3CON &= ~(1<<5); //禁止多机通讯方式
S3CON &= ~(1<<7); // 8位数据, 1位起始位, 1位停止位, 无校验
// IE2 &= ~(1<<3); //串口3禁止中断
IE2 |=(1<<3); //串口3允许中断
S3CON |=(1<<4); //串口3允许接收
P_SW2 &= ~2; //切换到 P0.0 P0.1
// P_SW2 |= 2; //切换到 P5.0 P5.1
for(i=0; i<RX3_Length; i++) RX3_Buffer = 0;
B_TX3_Busy= 0;
TX3_read = 0;
RX3_write = 0;
}
各位兄弟,买了一个串口输出测距模块,资料上是9600波特率,一位停止位,不校验,特意问了卖家说没有起始位,STC官方的这个参数设置是带一个起始位的,用的STC15W4K56S4,这里这个串口3参数怎么配置可以配置为8位数据位,不要起始位,一位停止位,不校验?
现在的问题是用电脑串口助手按照那个模块数据格式模拟发送数据送到STC15的串口3可以正常接收显示,那个模块接到串口助手发出的数据也是对的,说明模块没问题,但直接把模块接到STC15的串口3上就接收不到数据,不知道是不是和这个起始位有关?
不要启始位,那么0xFF怎么办?
0xFE和0xFD有什么区别?
不如用SPI? lcw_swust 发表于 2019-8-26 11:51
不要启始位,那么0xFF怎么办?
0xFE和0xFD有什么区别?
模块是串口接口,模块和程序分别用串口助手测试正常,把它们连起来串口3就收不到模块发出的的数据,其它原因找不到了,就想着会不会是卖家说的这个模块没有起始位的问题? 本帖最后由 lcw_swust 于 2019-8-26 12:11 编辑
newywx 发表于 2019-8-26 11:54
模块是串口接口,模块和程序分别用串口助手测试正常,把它们连起来串口3就收不到模块发出的的数据,其它 ...
没启始位是不可能的,估计卖家不懂。
单片机与模块通信要注意是否需要串电阻,是否需要上拉,注意RXD、TXD是否交叉。
分享下我的代码:
typedef unsigned charU8;
typedef signed charS8;
typedef unsigned int U16;
typedef signed int S16;
typedef unsigned longU32;
typedef signed longS32;
#define BIT(x) (1<<(x))
//IOSET(PORTB,BIT(0));//将端口在X为1的位置1
#define IOSET(port,x)(port)|=(x)
//IOCLR(PORTB,BIT(0));//将端口在X为1的位清0
#define IOCLR(port,x)(port)&=~(x)
//系统时钟定义,用于计算波特率
#define FOSC 20000000
//串口3,T3作为波特率//uart3_init(9600,1)
void uart3_init(U32 baud,U8 es)
{
U16 v;
IOSET(T4T3M,BIT(1));//T3x12
v=65536-((FOSC*2/4/baud+1)/2);//+1)/2为四舍五入
//也可以用这个:v=65536-FOSC/4/baud
T3H=v>>8;
T3L=v;
IOSET(T4T3M,BIT(3));//T3R=1;
S3CON=0X50; //T3为波特率,允许接收
if(es)//允许中断
IOSET(IE2,BIT(3));//ES3
else
IOCLR(IE2,BIT(3));//ES3
} lcw_swust 发表于 2019-8-26 12:05
没启始位是不可能的,估计卖家不懂。
单片机与模块通信要注意是否需要串电阻,是否需要上拉,注意RXD、TX ...
谢兄弟回复,我STC15w是5V供电的,电路上串口3的发送接收脚分别串了200多欧的电阻后接到模块的发送接收脚,因为模块资料上也是写的5v供电的,手上示波器坏了没量模块信号电平,刚和卖家确认了,模块出来的信号电平是3.3v的,不知道会不会是这个原因,但理论上3.3v的信号5V单片机也应该能识别的 newywx 发表于 2019-8-26 13:42
谢兄弟回复,我STC15w是5V供电的,电路上串口3的发送接收脚分别串了200多欧的电阻后接到模块的发送接收脚 ...
哦,一般5V与3.3V串200欧是没问题的。
那就再检查一下吧,或者交换一下TXD、RXD。 lcw_swust 发表于 2019-8-26 13:49
哦,一般5V与3.3V串200欧是没问题的。
那就再检查一下吧,或者交换一下TXD、RXD。 ...
我再试试看 lcw_swust 发表于 2019-8-26 12:05
没启始位是不可能的,估计卖家不懂。
单片机与模块通信要注意是否需要串电阻,是否需要上拉,注意RXD、TX ...
忘了反馈了,加了10k上拉后接上模块串口3可以收到模块发来的数据了{:handshake:} newywx 发表于 2019-8-28 09:30
忘了反馈了,加了10k上拉后接上模块串口3可以收到模块发来的数据了...
{:victory:} 串口不要起始位,第一次听说,没起始位、停止位,串口不能正确接收的。 小李非刀 发表于 2019-8-28 22:28
串口不要起始位,第一次听说,没起始位、停止位,串口不能正确接收的。
我看他模块资料上没提到,就特意又问了一次,说没起始位,然后正好收不到数据,就想着是不是这个问题了
页:
[1]