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;
                        }
                }






页: [1]
查看完整版本: 深入了解串口通信的停止位