找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

问一个单片机串口通讯数据丢位的问题

查看数: 3496 | 评论数: 19 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2019-6-7 20:33

正文摘要:

问题说明:我设置的波特率是9600,然后这个程序就是笔记本发送数据给单片机,单片机马上原封不动地发送回去,但是在发送回来的时候发现缺位了,比如说我发送了一串数字2019060720055905,但是传回来的时候有时候就少 ...

回复

ID:207421 发表于 2019-6-8 12:37
哪里抄的代码,代码中很多错误
串口通信注意的是:
1. 晶振的误差会导致数据发生错误
2. 发送速度的快慢, 一个巴掌扇过去,那个人还没来得及回复你,你又一个巴掌,他做哑巴得了,你白问了.
3. 没有对数据进行校验的函数
4. 接收或发送数据时,  没有进行ES或EA处理,不就存在BUG了么
ID:557163 发表于 2019-6-8 22:57
这么改
1. 漏了个分号
void SendByte(uchar dat)
{
        SBUF = dat;
        while(!TI);  // 这里加上分号
        TI=0;
}

2.  中断服务程序的收发看似没问题,当单片机的波特率比电脑略低时,有一定的概率上一个字节发送还没完下一个字节就收到了,简单粗暴的改法是
把   SBUF=temp;
改为  SendByte(temp);
ID:523537 发表于 2019-6-11 00:03
yumer 发表于 2019-6-10 11:39
串口通讯的时间是最主要的,要保证两个通讯的频率是一样的,其次对于发射和接受的延时等待时间也要一致

嗯嗯,确实是这样,多谢指教了!
ID:243060 发表于 2019-6-10 11:39
串口通讯的时间是最主要的,要保证两个通讯的频率是一样的,其次对于发射和接受的延时等待时间也要一致
ID:523537 发表于 2019-6-10 09:55
阔爱的钊钊 发表于 2019-6-10 01:01
波特率和检验的问题,小老弟串口不要用人家的源码呀,bug多得吓死人哟,还占资源

自己也是刚学,很多东西都不太懂,只好在源码上做简单修改
ID:222006 发表于 2019-6-10 01:01
波特率和检验的问题,小老弟串口不要用人家的源码呀,bug多得吓死人哟,还占资源
ID:552783 发表于 2019-6-9 21:13
我觉得可以加个校验
ID:523537 发表于 2019-6-9 14:12
he_37 发表于 2019-6-8 22:57
这么改
1. 漏了个分号
void SendByte(uchar dat)

更有意思的是我整个串口中断程序没有把TI置0也可以进行串口通讯,只是也有丢位。
void UART_SER() interrupt 4
{
        uchar temp;
        if(RI)
        {
                RI = 0;
                temp = SBUF;
                SBUF = temp;
                /*下面两个语句就是SendByte(uchar dat)的功能*/
                while(!TI);
        }
}

ID:523537 发表于 2019-6-9 14:06
he_37 发表于 2019-6-8 22:57
这么改
1. 漏了个分号
void SendByte(uchar dat)

分号是我复制粘贴上来的时候不小心删掉了,不过我想了下你的改法应该是对的,后面我尝试了下也确实是对的,没有出现过一次丢包,不过我又有了一个新问题,我先把代码复制上来吧。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;语句删了,那么按道理就是应该无限循环啊,为啥还会完整把整个数据接收完呢?我现在也搞不懂了。
ID:519141 发表于 2019-6-8 19:34
数据传输开始和完成都需要有确认语句,方可进行下一步的操作
ID:523537 发表于 2019-6-8 19:16
lele5211314 发表于 2019-6-8 17:30
数码管用定时器0,串口的用定时器1

我数码管确实用的是定时器0,串口用的是定时器1啊
ID:523537 发表于 2019-6-8 19:15
xuyaqi 发表于 2019-6-8 08:35
发送双方都要给对方留出处理信息的时间。

那需要在哪里加延时函数呢?
ID:523537 发表于 2019-6-8 19:14
lwh999995 发表于 2019-6-8 12:37
哪里抄的代码,代码中很多错误
串口通信注意的是:
1. 晶振的误差会导致数据发生错误

这个代码是我参照例子写的。首先我用的是11.0592MHz的晶振,波特率9600,我想问下需要延时要在哪里加_nop_()函数呢?另外我这个因为是电脑和单片机通讯,为了简单一点所以没有校验,最后接受和发送数据的时候要关闭总中断来避免多个中断干扰数据传输吗?
ID:93224 发表于 2019-6-8 17:30
数码管用定时器0,串口的用定时器1
ID:259083 发表于 2019-6-8 17:09
可能是两个单片机的波特率误差导致的,你可以换几组波特率试试,如果还是不行,最好加CRC 校验等校验模式进行校验,也可以考虑采用纠错码来纠正误码!
ID:557425 发表于 2019-6-8 11:42

发送双方都要给对方留出处理信息的时间。



ID:94031 发表于 2019-6-8 08:35
发送双方都要给对方留出处理信息的时间。
ID:523537 发表于 2019-6-8 06:14
恳请各位大佬指点

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表