打印

深入了解串口通信的停止位

[复制链接]
672|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
skw168|  楼主 | 2019-10-4 21:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 skw168 于 2019-10-4 21:55 编辑

1.系统:使用IO模拟串口通信发送数据给电脑的串口助手//
2.设定参数:
波特率:4800 ;8位数据位,无校验,1位停止位
3.问题点:
在使用串口连续发送某个数据时,发现电脑接收端会出现错误数据
比如连续发送0x41,电脑接收的数据却为0x50,
目前推测是因为串口接收端没有很好的识别到起始位和停止位,
所以造成了数据接收错误
因此在这里引入以前忽视的一个知识点:1位停止位,1.5位停止位和2位停止位
目前我改成直接使用2位停止位,让接收端能够更好的识别到起始和停止位,避免和数据为混淆

         下面是有问题的程序代码,此程序在中断里面执行,每208us执行一次
                buff1 = 'A';
                switch(count_timer2)
                {
                        case 0:
                        {
                                PA4 = 0;
                                count_timer2 = 1;break;
                        }
                        case 1:
                        {
                                count_timer2 = 2;
                                if(buff1 & 0x01) PA4 = 1;
                                else PA4 = 0;        break;
                        }
                        case 2:
                        {
                                count_timer2 = 3;
                                if(buff1 & 0x02) PA4 = 1;
                                else PA4 = 0;        break;
                        }
                        case 3:
                        {
                                count_timer2 = 4;
                                if(buff1 & 0x04) PA4 = 1;
                                else PA4 = 0;        break;
                        }
                        case 4:
                        {
                                count_timer2 = 5;
                                if(buff1 & 0x08) PA4 = 1;
                                else PA4 = 0;        break;
                        }
                        case 5:
                        {
                                count_timer2 = 6;
                                if(buff1 & 0x10) PA4 = 1;
                                else PA4 = 0;        break;
                        }
                        case 6:
                        {
                                count_timer2 = 7;
                                if(buff1 & 0x20) PA4 = 1;
                                else PA4 = 0;        break;
                        }
                        case 7:
                        {
                                count_timer2 = 8;
                                if(buff1 & 0x40) PA4 = 1;
                                else PA4 = 0;        break;
                        }
                        case 8:
                        {
                                count_timer2 = 9;
                                if(buff1 & 0x80) PA4 = 1;
                                else PA4 = 0;        break;
                        }
                        case 9:
                        {
                                count_timer2 = 0;
                                PA4 = 1;
                                //cnt_uart_en = 0x02;
                        }
                }






使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

37

主题

137

帖子

6

粉丝