哪里抄的代码,代码中很多错误 串口通信注意的是: 1. 晶振的误差会导致数据发生错误 2. 发送速度的快慢, 一个巴掌扇过去,那个人还没来得及回复你,你又一个巴掌,他做哑巴得了,你白问了. 3. 没有对数据进行校验的函数 4. 接收或发送数据时, 没有进行ES或EA处理,不就存在BUG了么 |
这么改 1. 漏了个分号 void SendByte(uchar dat) { SBUF = dat; while(!TI); // 这里加上分号 TI=0; } 2. 中断服务程序的收发看似没问题,当单片机的波特率比电脑略低时,有一定的概率上一个字节发送还没完下一个字节就收到了,简单粗暴的改法是 把 SBUF=temp; 改为 SendByte(temp); |
yumer 发表于 2019-6-10 11:39 嗯嗯,确实是这样,多谢指教了! |
串口通讯的时间是最主要的,要保证两个通讯的频率是一样的,其次对于发射和接受的延时等待时间也要一致 |
阔爱的钊钊 发表于 2019-6-10 01:01 自己也是刚学,很多东西都不太懂,只好在源码上做简单修改 |
波特率和检验的问题,小老弟串口不要用人家的源码呀,bug多得吓死人哟,还占资源 |
我觉得可以加个校验 |
he_37 发表于 2019-6-8 22:57 更有意思的是我整个串口中断程序没有把TI置0也可以进行串口通讯,只是也有丢位。 void UART_SER() interrupt 4 { uchar temp; if(RI) { RI = 0; temp = SBUF; SBUF = temp; /*下面两个语句就是SendByte(uchar dat)的功能*/ while(!TI); } } |
he_37 发表于 2019-6-8 22:57 分号是我复制粘贴上来的时候不小心删掉了,不过我想了下你的改法应该是对的,后面我尝试了下也确实是对的,没有出现过一次丢包,不过我又有了一个新问题,我先把代码复制上来吧。void UART_SER() interrupt 4{ uchar temp; if(RI) { RI = 0; temp = SBUF; SBUF = temp; /*下面两个语句就是SendByte(uchar dat)的功能*/ while(!TI); TI = 0; } } 我是这么想的,电脑发送了一个8位数据过来,单片机接收端的SBUF接收了,然后我把数据转给了发送端的SBUF,然后就是while(!TI);等待单片机发送完,但是我的串口中断还是开的,那么当单片机数据发送完TI置1,那么就会触发中断,然后又从中断函数开头uchar temp;开始,那么而且我也把TI=0;语句删了,那么按道理就是应该无限循环啊,为啥还会完整把整个数据接收完呢?我现在也搞不懂了。 |
数据传输开始和完成都需要有确认语句,方可进行下一步的操作 |
lele5211314 发表于 2019-6-8 17:30 我数码管确实用的是定时器0,串口用的是定时器1啊 |
xuyaqi 发表于 2019-6-8 08:35 那需要在哪里加延时函数呢? |
lwh999995 发表于 2019-6-8 12:37 这个代码是我参照例子写的。首先我用的是11.0592MHz的晶振,波特率9600,我想问下需要延时要在哪里加_nop_()函数呢?另外我这个因为是电脑和单片机通讯,为了简单一点所以没有校验,最后接受和发送数据的时候要关闭总中断来避免多个中断干扰数据传输吗? |
数码管用定时器0,串口的用定时器1 |
可能是两个单片机的波特率误差导致的,你可以换几组波特率试试,如果还是不行,最好加CRC 校验等校验模式进行校验,也可以考虑采用纠错码来纠正误码! |
发送双方都要给对方留出处理信息的时间。 |
发送双方都要给对方留出处理信息的时间。 |
恳请各位大佬指点![]() |