请教,用双串口的单片机转发串口数据会丢失数据该如何处理呢?

2020-01-26 12:52发布

用老妖的双串口型号,Uart1接PC,Uart2接其它串口设备,波特率相同都是9600bps。

PC下发的数据定长10字节,mcu先缓存,满10字节后转发到Uart2,这一步没有问题,数据完整收到。
串口设备上发的数据是不定长度的,从几字节到1K多,我在Uart2的接收中断中收到一个字节后就直接发往Uart1,此时PC收到的数据不完整,中间有些字节会丢失,试过将PC到Uart1的波特率提高到19200bps,无果。

我想应该要弄个缓冲区缓存一下,可是没有思路,请求哪位指点一下。

//向Uart1发送一个字符
void send_char_com(unsigned char ch)
{
    SBUF=ch;
    while(TI==0);
    TI=0;
}


//Uart2接收中断函数
void serial2 () interrupt 8 // using 1
{
        unsigned char ch;
        ch=S2BUF;
        if(S2CON & S2RI)         //如果是接收
        {
                S2CON &= ~S2RI;        //清标志位
                send_char_com(ch);   //转发到Uart1
        }
           /*
        if(S2CON & S2TI)
        {
           S2CON &= ~S2TI;        //清标志位
           busy=0;
        }
           */

}


=======================改错字
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
easier
1楼-- · 2020-01-27 04:50
//Uart2接收中断函数
void serial2 () interrupt 8 // using 1
{
unsigned char ch;
ch=S2BUF;
if(S2CON & S2RI)  //如果是接收
{
S2CON &= ~S2RI; //清标志位
send_char_com(ch);   //转发到Uart1
}
           /*
if(S2CON & S2TI)
{
   S2CON &= ~S2TI; //清标志位
   busy=0;
}
           */

}




//Uart2接收中断函数
void serial2 () interrupt 8 // using 1
{
unsigned char ch;

if(S2CON & S2RI)  //如果是接收
{
  ch=S2BUF;
  S2CON &= ~S2RI; //清标志位
  SBUF=ch;                       //转发到Uart1  <--
}
           /*
if(S2CON & S2TI)
{
   S2CON &= ~S2TI; //清标志位
   busy=0;
}
           */

}
eblc1388
2楼-- · 2020-01-27 06:49
 精彩回答 2  元偷偷看……
changlyou77
3楼-- · 2020-01-27 09:46
回复【6楼】huayuliang 花生
-----------------------------------------------------------------------

谢谢指教~
vtte
4楼-- · 2020-01-27 14:51
试了很多方法还是会丢,老大说不计成本,我就直接上STM32了,正好有片103RCT6,简单试了下好像可以,不过感觉太奢侈了
cecwxf
5楼-- · 2020-01-27 15:47
tenx
6楼-- · 2020-01-27 19:13
你发送用阻塞方式肯定不行,加缓冲区,用中断发送肯定没有问题

一周热门 更多>