串口接收数据出错问题

时间:2021-04-30 17:41:13
unsigned char recflag = 0;
idata unsigned char rsv_buffer[20]; 
void UART_Receive(void) interrupt 8
{


u16   k   =   0;
//receive_count = 0;
k = S2CON ; 
k = k & 0x01;

    if(k==1)
    {   

S2CON = S2CON & 0xFE; //1111,1110

if(recflag == 8)recflag = 0;
rsv_buffer[recflag]=S2BUF;
     
recflag++;

               

}

else
{
     //TI = 0;
   S2CON = S2CON&0xfd;
   //receive_count = 0;
}

string_to_OSD(11,5,rsv_buffer);
      
}
1.怎么我接收到的数据第一次时八个以下字符正常.多于八个的出错?
2.怎么我第二次开始接收数据全乱了?

11 个解决方案

#1


接收后,清空缓冲区试试

#2


波特率太小么

#3


怎么清?S2CON = S2CON & 0xFE; //1111,1110 
不是这样嘛?

#4


发送一点问题都没有.波特率应该没问题我试过2400还有1200都一样.

#5


你利用串口调试工具查一下串口数据对不?  另外程序中只看到了开始位(0xfd),也没有没处理校验位等。

#6


对了.波特率换成9600还没有八位数据了.才有四位对了.

#7


fuzzy_man 怎样处理校验位?

#8


你把代码贴全一点吧,这样很难看出来。

这是我在linux下写的一个串口接收程序,你参考一下,其实串口程序主要就是设置一些参数项,你设对了一般就可以了,具体的参数含义可以查一下资料。
...

do{
   state->fd = open(device,O_RDWR);
}while(state->fd<0 && errno == EINTR);

if(isatty(state->fd))
{
    struct termios ios;
    if(0!=tcgetattr(state->fd,,&ios))
      {
          perror("get ttyS1");
          goto Fail;   
       }
    cfsetispeed(&ios,B115200);
    ios.c_cflag |= (CLOCAL | CREAD);
    ios.c_lfag &= ~(ICANON | ECHO | ECHOE | ISIG);
    ios.c_oflag &= ~OPOST;
    ios.c_cc[VMIN] = 0;
    ios.c_cc[VTIME] = 100;
 if(0!=tcsetattr(state->fd,TCSANOW,&ios))
     {
        perror("setup ttyS1");
        goto Fail;   
       }  
}

#9


#10


还是没搞定.谁有stc12的.调试过了的.我这的总是丢数据搞不清楚原因了.

#11


串口发送数据的时候是一个bit一个bit的发送的,接收的时候也是(串口接收中有一个位移寄存器,接收一次左移一位)!你如果想接收一字节数据,rsv_buffer[7]中的才是你真正想得到的。如果你想接收一字节以上的数据的话,得用另一个变量来存放数据了。然后把它们合起来就得要你想要的东西了。

#1


接收后,清空缓冲区试试

#2


波特率太小么

#3


怎么清?S2CON = S2CON & 0xFE; //1111,1110 
不是这样嘛?

#4


发送一点问题都没有.波特率应该没问题我试过2400还有1200都一样.

#5


你利用串口调试工具查一下串口数据对不?  另外程序中只看到了开始位(0xfd),也没有没处理校验位等。

#6


对了.波特率换成9600还没有八位数据了.才有四位对了.

#7


fuzzy_man 怎样处理校验位?

#8


你把代码贴全一点吧,这样很难看出来。

这是我在linux下写的一个串口接收程序,你参考一下,其实串口程序主要就是设置一些参数项,你设对了一般就可以了,具体的参数含义可以查一下资料。
...

do{
   state->fd = open(device,O_RDWR);
}while(state->fd<0 && errno == EINTR);

if(isatty(state->fd))
{
    struct termios ios;
    if(0!=tcgetattr(state->fd,,&ios))
      {
          perror("get ttyS1");
          goto Fail;   
       }
    cfsetispeed(&ios,B115200);
    ios.c_cflag |= (CLOCAL | CREAD);
    ios.c_lfag &= ~(ICANON | ECHO | ECHOE | ISIG);
    ios.c_oflag &= ~OPOST;
    ios.c_cc[VMIN] = 0;
    ios.c_cc[VTIME] = 100;
 if(0!=tcsetattr(state->fd,TCSANOW,&ios))
     {
        perror("setup ttyS1");
        goto Fail;   
       }  
}

#9


#10


还是没搞定.谁有stc12的.调试过了的.我这的总是丢数据搞不清楚原因了.

#11


串口发送数据的时候是一个bit一个bit的发送的,接收的时候也是(串口接收中有一个位移寄存器,接收一次左移一位)!你如果想接收一字节数据,rsv_buffer[7]中的才是你真正想得到的。如果你想接收一字节以上的数据的话,得用另一个变量来存放数据了。然后把它们合起来就得要你想要的东西了。