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_clearcase/" target="_blank" >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机上,而是在方舟的嵌入式板上. |