搜索
bottom↓
回复: 12

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

[复制链接]

出0入33汤圆

发表于 2011-6-30 16:31:16 | 显示全部楼层 |阅读模式
用老妖的双串口型号,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;
        }
           */

}


=======================改错字

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入33汤圆

 楼主| 发表于 2011-6-30 20:43:24 | 显示全部楼层
自顶一下

出0入0汤圆

发表于 2011-6-30 22:22:25 | 显示全部楼层
数据是编帧的还是离散的,如果是编帧的,是定长的还是不定长的?

如果是编帧定长的数据,则接收端缓存区定长,半满或全满就启动另一个串口的发送程序
如果是不定长数据或离散数据,则可以用超时检测的方法,每次收到一个字节数据或一帧数据后,开始检测超时,如果继续收到数据则继续缓存,否则超时后启动发送程序。

我只给你参考的方法,具体实现还得自己结合实际情况考虑和设计。

出0入0汤圆

发表于 2011-6-30 22:31:50 | 显示全部楼层
关键是计算时间,两个UART不能互相干扰。。

出0入0汤圆

发表于 2011-6-30 22:59:28 | 显示全部楼层
建议看看modbus的处理方式。

然后你在中断里面发送 似乎不明智

出0入0汤圆

发表于 2011-7-1 00:19:50 | 显示全部楼层
回复【楼主位】vtte
-----------------------------------------------------------------------
LS说的是,建议你不要再中断里发送,我在中断里发送就从来没有成功过,也许是本人愚钝吧,搞不定的。可以在主函数里发送,LZ试试吧,只是建议。

出0入0汤圆

发表于 2011-7-2 00:02:36 | 显示全部楼层
回复【5楼】changlyou77  
-----------------------------------------------------------------------

也可以的,只是得控制好时间。

主函数里发送比较好。

楼主可以设置一个缓冲区,保存未来得及发送的数据,不过前提还是要发送比接收快。还需要一个变量做标识,在发送忙的时候把接收到的数据存入缓冲区。

出0入0汤圆

发表于 2011-7-2 09:37:52 | 显示全部楼层
//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;
}
           */

}

出0入0汤圆

发表于 2011-7-2 09:47:46 | 显示全部楼层
回复【楼主位】vtte  
试过将pc到uart1的波特率提高到19200bps,无果
-----------------------------------------------------------------------
同意【6楼】 huayuliang 花生所言, 试把Uart2接其它串口设备的波特率提高, 或把pc到uart1的波特率减至4800bps或以下。

出0入0汤圆

发表于 2011-7-13 10:36:19 | 显示全部楼层
回复【6楼】huayuliang 花生
-----------------------------------------------------------------------

谢谢指教~

出0入33汤圆

 楼主| 发表于 2011-7-13 19:09:39 | 显示全部楼层
试了很多方法还是会丢,老大说不计成本,我就直接上STM32了,正好有片103RCT6,简单试了下好像可以,不过感觉太奢侈了

出0入0汤圆

发表于 2013-10-25 19:57:49 | 显示全部楼层

出0入0汤圆

发表于 2013-10-25 21:12:08 来自手机 | 显示全部楼层
你发送用阻塞方式肯定不行,加缓冲区,用中断发送肯定没有问题
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 14:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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