4450|16

61

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

串口读写问题 [复制链接]

有大量数据通过串口长度不定
而每次只读取128字节
循环读取
当读到指定字符串时跳出循环
即数据结束
该怎么做呢

我是这样做的
  发送命令
  延时2秒
  for(i = 0;i < 500;i++)
  {
   Delay_ms(100);
   lenth = Uart0_RecvBlock(rcvbuf, 128);
   rxdata = rcvbuf + lenth - 9;
   if(strncmp(rxdata, "CONNECT\r\n", 9) == 0))
   {
    break;
   }
  }

只是发现会不会出现最后一次读取只读到"NNECT\r\n"之类的以致判断出错
有什么好方法推荐下

最新回复

简单的说 如果串口一次要接收10K或其他大小不定的数据 这些数据的最后一个字符串都是Congratulations\r\n接收才是正确的 且数据接收不能丢失 而串口中断缓存只128字节 你们会怎么做呢  详情 回复 发表于 2010-1-30 08:47
点赞 关注

回复
举报

76

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
用strstr

for(i = 0;i < 500;i++)
{
    Delay_ms(100);
    lenth = Uart0_RecvBlock(rcvbuf, 128);
    /**这里判断是否接受有误/
    if(rcvbuf, "CONNECT\r\n") != 0))
    {
         break;
    }
}
 
 

回复

89

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
什么单片机?还是计算机端的?
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 1 楼 ytmayer 的回复:
用strstr

for(i = 0;i < 500;i++)
{
? ? Delay_ms(100);
? ? lenth = Uart0_RecvBlock(rcvbuf, 128);
? ? /**这里判断是否接受有误/
? ? if(rcvbuf, "CONNECT\r\n") != 0))
? ? {
? ? ? ? break;
? ? }
}


会不会出现一个字符串一半上次读了
还有一半这次读造成比较出错啊
这该怎么办
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 2 楼 galle 的回复:
什么单片机?还是计算机端的?

单片机
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

6
 
单片机通过串口给MODEM发命令
然后读取数据
判断一个命令结束后再发另一个命令
一般咋做
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 5 楼 sytu_chyq 的回复:
单片机通过串口给MODEM发命令
然后读取数据
判断一个命令结束后再发另一个命令
一般咋做

一般串口发送是要判断是否发送完成,发送完成之后 在去发送另外的指令

发送命令后,对方给你返回一些信息,然后判断返回的信息,去执行否则操作

接收一般都在中断中,接收到数据之后,尽快处理,否则占用串口,比如保存起来,然后置一个标志位,在主程序中判断标准位,处理串口接收的数据
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

8
 
而每次只读取128字节
循环读取
当读到指定字符串时跳出循环

楼主不觉得这几句话有矛盾吗? 只读取128后面又说指定字符,这两个条件应该是OR关系而不是AND关系吧。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 7 楼 hallowwar 的回复:
而每次只读取128字节
循环读取
当读到指定字符串时跳出循环

楼主不觉得这几句话有矛盾吗? 只读取128后面又说指定字符,这两个条件应该是OR关系而不是AND关系吧。


我是说假如有很多数据通过串口
而中断缓存只128
这样每次最多只能读128
要读多少次是预先不知道的
又不想延时太长时间
只好判断结束的那个字符串
又担心这个字符串一半在上次读了
还有一半这次读造成比较出错啊
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 6 楼 cfanlwn 的回复:
引用 5 楼 sytu_chyq 的回复:
单片机通过串口给MODEM发命令
然后读取数据
判断一个命令结束后再发另一个命令
一般咋做

一般串口发送是要判断是否发送完成,发送完成之后 在去发送另外的指令

发送命令后,对方给你返回一些信息,然后判断返回的信息,去执行否则操作

接收一般都在中断中,接收到数据之后,尽快处理,否则占用串口,比如保存起来,然后置一个标志位,在主程序中判断标准位,处理串口接收的数据


我是中断加队列
每隔一段时间读一次比如100毫秒
要不然缓存满了后面的数据会丢失(我程序是这样做的)
比较最后一个字符串主要还是看看收到的是不是想要的
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

11
 
1 接收的长度是不定的,那作为结束标志的特定字符串会否在超过128出现?前面数据的如何处理以腾出缓冲区楼主考虑过没有?
2 按楼主所说的情况,结束标志在缓冲区中间的概率应在90%以上,可以按单个字符接收,并在接收中断中专门开一个标志来判断是否结束标志。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

12
 
#define endc  ..
int revframe(char*buff)
{
   char temp=~endc;
   int count =0;
   while(temp!=endc)
   {
       temp=getcuart();
       count++;
   }
   return count;
}
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

13
 
#define endc  ..
int revframe(char*buff)
{
  char temp=~endc;
  int count =0;
  while(temp!=endc)
  {
      temp=getcuart();
      *buff++=temp;
      count++;
  }
  return count;
}
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

14
 
char getc()
{
    while(!uartrevready);
    return uartrevbuff;
}
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

15
 
引用 10 楼 tcdzyq 的回复:
1 接收的长度是不定的,那作为结束标志的特定字符串会否在超过128出现?前面数据的如何处理以腾出缓冲区楼主考虑过没有?
2 按楼主所说的情况,结束标志在缓冲区中间的概率应在90%以上,可以按单个字符接收,并在接收中断中专门开一个标志来判断是否结束标志。



对于1
得保证在缓冲区未满的情况下把数据读出处理,以腾出缓冲区保证后面的数据不丢失
我是每隔100毫秒读一次,此时缓冲区还没满吧(9600bps)
如果特定的字符串只出现在一次读取过程中就不会有问题了
我是想
比如CONNECT\r\n
如果CO出现在上次的读取过程中
而NNECT\r\n出现在这次的读取中并且结束了
那我的程序判断就会出错
不知道有啥好办法
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

16
 
程序中lenth是实际读取的字节数
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

17
 
简单的说
如果串口一次要接收10K或其他大小不定的数据
这些数据的最后一个字符串都是Congratulations\r\n接收才是正确的
且数据接收不能丢失
而串口中断缓存只128字节
你们会怎么做呢
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表