我想用57600的波特率,但写入命令(0x02),随后写入数据0x03,0x98,及时调整单片机波特率后去读不到数据(死机),不知道为什么?代码如下: mDelaymS(10); xWriteCH375Cmd(0x02);//设置通讯波特率为57600 xWriteCH375Data(0x03); xWriteCH375Data(0x98); //调整单片机波特率57600, mDelaymS(1); UCSR1B = 0x00; //disable while setting baud rate UCSR1A = 0x00; UCSR1C = 0x06; UBRR1L = 0x08; //set baud rate lo UBRR1H = 0x00; //set baud rate hi UCSR1B = 0x1C; mDelaymS(1); //至少延时1ms temp=xReadCH375Data();//在此位置死机 请指教,谢谢
temp=xReadCH375Data();// 您在读什麽数据啊??
CH375串行口波特率设置完成后以新设定的通讯波特率输出操作状态,我在读取这个状态啊,请指教
不需要读取状态。
有返回状态,如果不读取的话,单片机再发其他指令后,单片机的读缓冲区会出现数据尚未读取又接受新数据,这样要抱错的呀, CH375的资料上明明写着波特率重新设定后会输出操作状态的
是有状态返回,这时候你读到的状态是什么呢?是操作成功吗?
读不到,我用的是串口,工作在查询状态,单片机会死在这个死循环里面while(!(UCSR1A&(1<
那你不设置波特率的话可以操作吗?也就是用CHECK-EXIST命令是可以通过的吗?
我单片机用9600的波特率,CH375用默认的9600波特率,CHECK-EXIST命令可以通过
有没有解决啊 我也遇到这个问题了 默认的9600波特率,CHECK-EXIST命令可以通过 换成别的都不行
不会的,你在设置新的375的波特率之后,得重新设置单片机的波特率为相应的新的波特率。大体如下:
在默认9600波特率下与375通信; xWriteCH375Cmd(CMD_SET_BAUDRATE); //设置新的375波特率,设置为57600 xWriteCH375Data(0x03); //输入分频系数 xWriteCH375Data(0x98); //输入分频常数 TH1 = 0xFe; //重新设置单片机的波特率,22.118MHZ改为57600时取0XFE,计算:256-22118000/192/57600
375与单片机串口通信时,波特率误差不能超过2%。也就是说计算新的单片机波特率时,并不刚好是整数,而带入误差,误差太大的话两者可能通信不了。 你说换成别的不行,那你的单片机的晶振是多少的啊?换成什么波特率?
我用mega16 16M晶振 试过波特率1000000,19200,115200还有几个 都接收不到数据 ...调电路真折磨人 呵呵
那你计算下你的波特率的误差是多少?
1M:0% 115200:-3.5% 19200:0.2% 这是书上的理论值
呵呵 麻烦你了,刚接触这个,有点乱
CH375在收到修改波特率的命令后,等数百us再发状态返回, 所以单片机有两种处理方法: 1、推荐的,简单的,发出修改命令后,延时5ms以上,修改自身波特率,清除串口接收中断标志/清接收缓冲区,忽略CH375的返回状态,然后处理下一条命令 2、精确的,发出修改命令后,确保最后一个字节发送完毕后(关键是,将数据送到串口发送缓冲区,过一会它才能完全发出去,像16C550有发送移位寄存器空标志),修改自身波特率(修改时可能会无意中清除接收缓冲区中的数据),立即准备接收,否则就会错过CH375返回的状态而一直等下去
嗷嗷感谢楼上的老大啊
第一种推荐的那个已经都好用了(第二种的还没调通,还在试呢)
第二种: 已经确保发送移位寄存器空了,之后立即修改自身波特率(一条指令约 0.125us-0.25us) 问题是之后接受标志位一直为0,也就是说始终无数据接受(从确保发送移位寄存器空到查看接受标志位之间时间最大不超过1.5us) 也试过不查看接受标志位,直接读到的数据是 0 (怀疑是不是会有数据返回)