• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

串口通信读写数据问题,江湖救急!!!!!!!!!!!

发布: 2007-6-08 22:43 | 作者: seanhe | 来源: | 查看: 36次 | 进入软件测试论坛讨论

领测软件测试网
我现在write串口没问题,但是读串口的数据有问题,如下:
读代码while(1)
   {
   while((nread = read(fd,buff,512))>0)
    {  
    buff[nread] =0 ;  
   
    }
               }
串口设备发数据时候,有时候第一次发送可以接收到,第二次发送接受不到(好像是空的)第三次可能收不到,就这样循环,不知为何

 CNL 回复于:2004-09-09 15:36:52
读串口一般情况是这样处理的:
char *ptr;
char buff[1024];
ptr=buff;
超时标志=0;
将串口读fd设为非阻塞:fd = open(ctty,O_RDONLY|O_NDELAY);
signal(SIGALRM, 超时处理函数);
alarm(MAXTIMOUT超时);
while (1) {
   while (read(fd,ptr,1)!=0)  ptr++;
   if (超时标志置位(由超时处理函数负责设置)) {
      return 超时;
   }
}
alarm(0);

建议你的串口处理应当遵循串口通用标准方式:
STX+2字节长度+报文+ETX+BCC校验位
这样你的程序很容易和别的串口程序进行通讯,兼容性

 蓝色的天空 回复于:2004-09-09 16:18:48
谢谢风云使者

 ssliao 回复于:2004-09-14 08:42:05
收不到数据

 CNL 回复于:2004-09-14 08:55:36
收不到数据一般情况是你没有设置好通讯速率、停止位等参数,如
   termio_new.c_iflag=INPCK;
    termio_new.c_oflag=0;
    termio_new.c_cflag = termio_new.c_cflag | B9600 | CS8;
    termio_new.c_lflag=0;
    termio_new.c_cc[4] = 1;
    termio_new.c_cc[5] = 0;
你程序中设置了吗?

 ssliao 回复于:2004-09-14 10:48:34
我现在的工作是循环发送AT命令, 然后不停的接收cdma数据.我现在可以收到数据, 但收一段时间就停了.另外我是按你上面的代码设置串口的.我的代码如下,请大虾帮我看看,谢谢!

strcpy(buffer, "AT+CSI\r");
write(fd, buffer, strlen(buffer));
while(1)
{
if (write(fd, buffer, strlen(buffer)) < 7)
continue;
memset(buff, 0, sizeof(buff));
bufptr = buff;
usleep(1000);
while((len = read(fd, bufptr, buff + sizeof(buff) - bufptr - 1)) > 0)
    {
bufptr += len;
*bufptr = '\0';

if (bufptr[-1] == '\n' || bufptr[-1] == '\r')
{
printf("buff = %s\n", buff);
        break;
}
    }
// memset(recv, 0, sizeof(recv));
// mk_time(recv);
// strncat(buff, recv, strlen(recv));
// write(fh, buff, strlen(buff));
// printf("buff = %s\n", buff);
}

 CNL 回复于:2004-09-14 11:28:11
cdma你需要问一下cdma服务方,多长时间不发送数据就拆链,
如联通就是过一段时间没有发送数据就把链路拆了,
你需要在它拆之前发点东西。

 ssliao 回复于:2004-09-14 11:48:40
但是我是在不停的发送AT命令的呀.

 CNL 回复于:2004-09-14 11:54:40
同事讲仅发AT命令是不够的,还要有cdma认可的数据,呵呵,你是想省money吧

 ssliao 回复于:2004-09-14 12:00:10
不明白您的意思, 情大虾说明.

 CNL 回复于:2004-09-14 12:06:38
引用: “联通公司为了保证合法收益(注:cdma每次建链收一次费用)。。。”

 ssliao 回复于:2004-09-14 12:26:34
我们有SIM卡插在cdma模块上,而且我的另外一个程序可以不停地收到数据,只是速度慢而已,以收到OK为结束,大概每秒在20-25条左右数据,程序代码如下:

strncpy(buffer,"AT+CSI",6);
buffer[6]=13;
buffer[7]=10;
buffer[8]=0;
memset(S, 0, sizeof(S));
write(fd, buffer, strlen(buffer));
while(1)
{
memset(buff, 0, sizeof(buff));
len = read(fd, buff, sizeof(buff));
buff[len] = 0;
// printf("buff = %s\n", buff);
if(len > 0)
{
for(i = 0; i < len; i++)
{
if (buff[i] >= 32)
S[strlen(S)] = buff[i];
if (buff[i] == 'K')
{
memset(recv, 0, sizeof(recv));
mk_time(recv);
strcat(recv, "\n");
strncat(S, recv, strlen(recv));
write(fh, S, strlen(S));
// printf("S = %s\n", S);
memset(S, 0, sizeof(S));
write(fd, buffer, strlen(buffer));
}
}
}// else  write(fd, buffer, strlen(buffer));
// usleep(10000);
}

 ssliao 回复于:2004-09-14 12:29:01
我们要求达到30条/秒数据的速度才可以,而且不是在pc机上,而是在方舟的嵌入式板上.

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网