串口读写问题

sytu_chyq 2010-01-28 03:33:58
有大量数据通过串口长度不定
而每次只读取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"之类的以致判断出错
有什么好方法推荐下
...全文
109 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
sytu_chyq 2010-01-30
  • 打赏
  • 举报
回复
简单的说
如果串口一次要接收10K或其他大小不定的数据
这些数据的最后一个字符串都是Congratulations\r\n接收才是正确的
且数据接收不能丢失
而串口中断缓存只128字节
你们会怎么做呢
sytu_chyq 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cfanlwn 的回复:]
引用 5 楼 sytu_chyq 的回复:
单片机通过串口给MODEM发命令
然后读取数据
判断一个命令结束后再发另一个命令
一般咋做

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

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

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

我是中断加队列
每隔一段时间读一次比如100毫秒
要不然缓存满了后面的数据会丢失(我程序是这样做的)
比较最后一个字符串主要还是看看收到的是不是想要的
sytu_chyq 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 hallowwar 的回复:]
而每次只读取128字节
循环读取
当读到指定字符串时跳出循环

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

我是说假如有很多数据通过串口
而中断缓存只128
这样每次最多只能读128
要读多少次是预先不知道的
又不想延时太长时间
只好判断结束的那个字符串
又担心这个字符串一半在上次读了
还有一半这次读造成比较出错啊
hallowwar 2010-01-29
  • 打赏
  • 举报
回复
而每次只读取128字节
循环读取
当读到指定字符串时跳出循环

楼主不觉得这几句话有矛盾吗? 只读取128后面又说指定字符,这两个条件应该是OR关系而不是AND关系吧。
sytu_chyq 2010-01-29
  • 打赏
  • 举报
回复
程序中lenth是实际读取的字节数
sytu_chyq 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 tcdzyq 的回复:]
1 接收的长度是不定的,那作为结束标志的特定字符串会否在超过128出现?前面数据的如何处理以腾出缓冲区楼主考虑过没有?
2 按楼主所说的情况,结束标志在缓冲区中间的概率应在90%以上,可以按单个字符接收,并在接收中断中专门开一个标志来判断是否结束标志。

[/Quote]

对于1
得保证在缓冲区未满的情况下把数据读出处理,以腾出缓冲区保证后面的数据不丢失
我是每隔100毫秒读一次,此时缓冲区还没满吧(9600bps)
如果特定的字符串只出现在一次读取过程中就不会有问题了
我是想
比如CONNECT\r\n
如果CO出现在上次的读取过程中
而NNECT\r\n出现在这次的读取中并且结束了
那我的程序判断就会出错
不知道有啥好办法
gelu1040 2010-01-29
  • 打赏
  • 举报
回复
char getc()
{
while(!uartrevready);
return uartrevbuff;
}
gelu1040 2010-01-29
  • 打赏
  • 举报
回复
#define endc ..
int revframe(char*buff)
{
char temp=~endc;
int count =0;
while(temp!=endc)
{
temp=getcuart();
*buff++=temp;
count++;
}
return count;
}
gelu1040 2010-01-29
  • 打赏
  • 举报
回复
#define endc ..
int revframe(char*buff)
{
char temp=~endc;
int count =0;
while(temp!=endc)
{
temp=getcuart();
count++;
}
return count;
}
tcdzyq 2010-01-29
  • 打赏
  • 举报
回复
1 接收的长度是不定的,那作为结束标志的特定字符串会否在超过128出现?前面数据的如何处理以腾出缓冲区楼主考虑过没有?
2 按楼主所说的情况,结束标志在缓冲区中间的概率应在90%以上,可以按单个字符接收,并在接收中断中专门开一个标志来判断是否结束标志。
宇帆 2010-01-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sytu_chyq 的回复:]
单片机通过串口给MODEM发命令
然后读取数据
判断一个命令结束后再发另一个命令
一般咋做
[/Quote]
一般串口发送是要判断是否发送完成,发送完成之后 在去发送另外的指令

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

接收一般都在中断中,接收到数据之后,尽快处理,否则占用串口,比如保存起来,然后置一个标志位,在主程序中判断标准位,处理串口接收的数据
sytu_chyq 2010-01-28
  • 打赏
  • 举报
回复
单片机通过串口给MODEM发命令
然后读取数据
判断一个命令结束后再发另一个命令
一般咋做
sytu_chyq 2010-01-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 galle 的回复:]
什么单片机?还是计算机端的?
[/Quote]
单片机
sytu_chyq 2010-01-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ytmayer 的回复:]
用strstr

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

会不会出现一个字符串一半上次读了
还有一半这次读造成比较出错啊
这该怎么办
galle 2010-01-28
  • 打赏
  • 举报
回复
什么单片机?还是计算机端的?
mayer 2010-01-28
  • 打赏
  • 举报
回复
用strstr

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

27,511

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧