串口接收数据,运行一段时间后就接收不到了!Windows系统(共5篇)由网友“小海星”投稿提供,下面小编给大家整理串口接收数据,运行一段时间后就接收不到了!Windows系统,希望大家喜欢!
篇1:串口接收数据,运行一段时间后就接收不到了!Windows系统
操作系统是openserver5.05 打开串口后,将fd放入FD_SET集合,再用select探测。大体如下: open(...) while(1) { select(...) read(...) 处理交易... write(...) } 运行一段时间后,客户端明明有请求,可是select再也探测不到信号。程序一直循环。 我把select
操作系统是open server 5.05
打开串口后,将fd放入FD_SET集合。再用select探测。大体如下:
open(...)
while(1)
{
select(...)
read(...)
处理交易...
write(...)
}
运行一段时间后,客户端明明有请求,可是select再也探测不到信号。程序一直循环。
我把select设置成15秒,并累计时间,如果5分钟内没有交易,就将串口重新打开,但是日志显示重新打开了串口,但还是收不到交易。哪位大侠帮我分析下。
我打开串口如下:
int comm_open(char *comm_name)
{
int comm_fd;
struct termio comm_tty;
if((comm_fd = open(comm_name, O_RDWR|O_NDELAY)) < 0)
return(_ERROR_COMM_OPEN);
if(ioctl(comm_fd, TCGETA, &comm_tty))
return(_ERROR_COMM_GET);
comm_tty.c_iflag = 1;
comm_tty.c_oflag = 0;
comm_tty.c_cflag = (B9600|CS8|CREAD|HUPCL|CLOCAL);
comm_tty.c_lflag = 0;
comm_tty.c_clearcase/“ target=”_blank“ >cc[VMIN] = 1;
comm_tty.c_cc[VTIME]=0;
if(ioctl(comm_fd, TCSETA, &comm_tty) == -1)
return(_ERROR_COMM_SET);
return comm_fd;
}
CNL 回复于:-10-14 11:38:25sco 的select目前只支持socket的检测,不支持串口和消息队列
zengyh 回复于:2004-10-14 11:45:04但是他也能运行一段时间呀,交易照常运行,只是过了段时间后(几天到十几天不等),才收不到数据。对于select而言,只是对文件描述字集进行检查。
我在hp-unix上用这种方法是没有问题的,是不是在sco上用这种方法会不稳定?
CNL 回复于:2004-10-14 11:50:43select不是unix标准调用,不同的UNIXOS支持力度不同,
SCO对select的支持最差,只有通讯socket可用select正确检测到
其他的基本不支持
zengyh 回复于:2004-10-14 11:54:38请问一下,是不是在sco下,对串口操作只能采用循环读取的方式来处理交易呢。我之前就是这样的方法,但同样也存在过几天就收不到数据的现象呀。后来不得已才改成用select的方式。
我的串口打开的参数有没有什么问题?
CNL 回复于:2004-10-14 12:19:31看起来没什么问题,不过我的做法是读写句柄分开:
对于读fd非阻塞只读方式打开,对于写fd按你的参数设置
循环检测读fd数组,读数据用读fd句柄,回数据用写fd句柄
zengyh 回复于:2004-10-14 13:40:19那就是open两次,得到两个fd,
while(1)
{
read(fd_read...)
.......
write(fd_write...)
}
大致是这样吗?
CNL 回复于:2004-10-14 17:29:27我是这样做的,有个程序到现在已经跑了两年多了,还没有停过
zengyh 回复于:2004-10-15 10:16:58感觉那样做,超时比较难处理,能不能把你的通讯程序给我一份参考参考。
yh_zeng@sohu.com
万分感谢!
CNL 回复于:2004-10-15 10:19:12我们那个程序很大,涉及第3方版权问题,不好给你
zengyh 回复于:2004-10-15 11:22:29不过还是谢谢你
CNL 回复于:2004-10-15 11:40:30看了一下,我的写fd参数还有2点和你不同,
由于我们那个程序是处理高速网控接入,采用的是包传送方式,只设置了8位和速率:
comm_tty.c_iflag = INPCK;
comm_tty.c_cflag = comm_tty.c_cflag | B19200 | CS8;
locallocal 回复于:2004-10-19 11:30:31你们这样轮询,不会占用大量的资源么?
CNL 回复于:2004-10-19 11:41:06如果循环中没有select毫秒级延时的话,会把CPU都占掉
huairendaxiong 回复于:2004-11-16 09:33:02unix抓串口通讯的数据,有哪些工具呢?
thank you
ywwlyc 回复于:2004-12-09 12:04:07我的串口也是,我在rh9.0下运行,另一端是一个在windows2000 server下的串口调试助手,我的串口可以不停的发,另一端也能接收到,可是我的串口却接收不到调试助手发送的字符,那个助手还他妈自发自收,请问怎么控制我什么时候写?也就是怎么以阻塞的方式写?在open时用open(devname,~O_NONBLOCK)似乎也不行啊。
急
gissing 回复于:2004-12-09 16:43:09郁闷阿,我也要搞串口编程,可是我都不太懂啊。
请问那位兄弟有这方面的教程、源码或者网址阿,谢谢!
原文转自:www.ltesting.net
篇2:GPS串口数据接收程序实例
GPS串口数据接收程序实例
摘 要:目前GPS(全球定位系统)定位应用市场日趋成熟,正在进入应用的高速发展时期。本文以一款EverMore公司的GM-X205GPS接受模块为例,介绍了其数据格式,以及应用PIC16F874单片机RS232串口进行数据接收的程序。关键词:GPS、NMEA格式、PIC16F874、串口数据接收
1、 GPS应用简介
近年来GPS系统,已经在大地测绘、海上渔用、车辆定位监控、建筑、农业等各个领域得到广泛应用。从九十年代我国引进GPS定位技术开始,经过十多年的.市场培育,GPS定位应用进入了发展的最好时机,未来十年基于GPS的应用将会改变我们的生活和工作方式。
目前市场上的大部分GPS接受模块都是通过RS232串口与MCU进行数据传输的。这些数据包括经度、纬度、海拔高度、时间、卫星使用情况等基本信息。开发人员再依据这些基本数据,进行数据处理来完成整套的定位系统软件。
2、 GM-X205模块数据格式
在进行数据接受编程之前,先介绍一下该模块的数据格式。它支持NMEA-0183输出格式。信息如下:
GGA位置测定系统定位资料(Global Positioning System Fix Data)
GSV 导航卫星资料(GNSS Satellites in View)
RMC导航卫星特定精简资料(Recommended Minimum Specific GNSS Data)
VTG 方向及速度等相关资料(Course Over Ground and Ground Speed)
由于文章篇幅问题,笔者在这里只以接收GGA数据为例,格式如下:
$GPGGA,hhmmss,dddmm.mmmm,a,dddmm.mmmm,a,x,xx,x.x,x.x,M,,M,x.x,xxxx*CS
例:$GPGGA,033744,2446.5241,N,12100.1536,E,1,10,0.8,133.4,M,,,,*1F
说明见表:
区域
名称
例
单位
说明
1
信息ID
$GPGGA
GGA协议开始
2
UTC时间
033744
hhmmss
3
纬度
2446.5241
dddmm.mmmm
4
南/北半球指示
N
N=north ; S=south
5
经度
12100.1536
dddmm.mmmm
6
东/西半球指示
E
E=east ; W=west
7
定位指示
1
0 =未定位
1=定位SPS模式
2=定位DGPS, SPS模式
8
应位卫星数
10
00-12
9
HDOP
0.8
米
10
海拔高度
133.4
米
11
海拔高度单位
M
米
12
WGS84水准面划分
13
WGS-84水准面划分单位
14
累计GPS数据微分
本模块中不可用
15
参考工作站ID
本模块中不可用
16
校验位
*1F
上面例子中,我们可读出位置信息:北纬24度46.5241分,西经121度00.1536分
格林威治时间:3点37分44秒
3、 PIC16F874数据接收程序
笔者在系统中把接收到的数据处理后,显示到图形液晶屏上。限于篇幅在这里只给出数据接收部分程序,并且只接收经度和时间信息,并且给出格林威治时间转换为北京时间的转换函数。其他数据接收程序类似。
;**********************************************************
; THIS IS A GPS RECEIVER PROGRAM *
;**********************************************************
LIST P=16F874
INCLUDE P16F874.INC
;*******寄存器定义 ********************
TEMP1 EQU 0X27
W_TEMP EQU 0X54
STATUS_TEMP EQU 0X55
LONG1 EQU 0X40 ;LONG1--- LONG10经度的10位数据
LONG2 EQU 0X41
LONG3 EQU 0X42
LONG4 EQU 0X43
LONG5 EQU 0X44
LONG6 EQU 0X45
LONG7 EQU 0X46
LONG8 EQU 0X47
LONG9 EQU 0X48
LONG10 EQU 0X49
T1 EQU 0X58 ;T1---T6时间的6位数据
T2 EQU 0X59
T3 EQU 0X60
T4 EQU 0X61
T5 EQU 0X62
T6 EQU 0X63
;********************************************************
ORG 00H
NOP
NOP
GOTO MAIN
ORG 04H ;设定按中端健才开始数据接受
NOP
NOP
GOTO INTERRUPT
;*********判断头文件是不是'$GPGGA’**********
IDMESSAGE
BCF STATUS,RP0
BREAK0
CALL PAND
MOVWF TEMP1
MOVLW '$' ;detect $
SUBWF TEMP1,0
BTFSS STATUS,Z
GOTO BREAK0
CALL PAND
MOVWF TEMP1
MOVLW 'G' ;detect G
SUBWF TEMP1,0
BTFSS STATUS,Z
GOTO BREAK0
CALL PAND
MOVWF TEMP1
MOVLW 'P' ;detect P
SUBWF TEMP1,0
BTFSS STATUS,Z
GOTO BREAK0
CALL PAND
MOVWF TEMP1
MOVLW 'G' ;detect G
SUBWF TEMP1,0
BTFSS STATUS,Z
GOTO BREAK0
CALL PAND
MOVWF TEMP1
MOVLW 'G' ;detect G
SUBWF TEMP1,0
BTFSS STATUS,Z
GOTO BREAK0
CALL PAND
MOVWF TEMP1
MOVLW 'A' ;detect A
SUBWF TEMP1,0
BTFSS STATUS,Z
GOTO BREAK0
CALL PAND ;跳过逗号
RETURN
;************接收函数******************
RECEIVE
CALL PAND ;开始时间数据接收
MOVWF T1
CALL PAND
MOVWF T2
CALL PAND
MOVWF T3
CALL PAND
MOVWF T4
CALL PAND
MOVWF T5
CALL PAND
MOVWF T6 ;时间数据接收完成
CALL PAND ;跳过逗号
CALL PAND ;跳过10位纬度数据---开始
CALL PAND
CALL PAND
CALL PAND
CALL PAND
CALL PAND
CALL PAND
CALL PAND
CALL PAND
CALL PAND ;跳过10位纬度数据---结束
CALL PAND ;跳过逗号
CALL PAND ;跳过南/北纬判断位数据
CALL PAND ;跳过逗号
CALL PAND ;接受经度信号开始
MOVWF LONG1
CALL PAND
MOVWF LONG2
篇3:GPS串口数据接收程序实例
GPS串口数据接收程序实例
摘 要:目前GPS(全球定位系统)定位应用市场日趋成熟,正在进入应用的高速发展时期。本文以一款EverMore公司的GM-X205GPS接受模块为例,介绍了其数据格式,以及应用PIC16F874单片机RS232串口进行数据接收的程序。关键词:GPS、NMEA格式、PIC16F874、串口数据接收
1、 GPS应用简介
近年来GPS系统,已经在大地测绘、海上渔用、车辆定位监控、建筑、农业等各个领域得到广泛应用。从九十年代我国引进GPS定位技术开始,经过十多年的市场培育,GPS定位应用进入了发展的最好时机,未来十年基于GPS的'应用将会改变我们的生活和工作方式。
目前市场上的大部分GPS接受模块都是通过RS232串口与MCU进行数据传输的。这些数据包括经度、纬度、海拔高度、时间、卫星使用情况等基本信息。开发人员再依据这些基本数据,进行数据处理来完成整套的定位系统软件。
2、 GM-X205模块数据格式
在进行数据接受编程之前,先介绍一下该模块的数据格式。它支持NMEA-0183输出格式。信息如下:
GGA位置测定系统定位资料(Global Positioning System Fix Data)
GSV 导航卫星资料(GNSS Satellites in View)
RMC导航卫星特定精简资料(Recommended Minimum Specific GNSS Data)
VTG 方向及速度等相关资料(Course Over Ground and Ground Speed)
由于文章篇幅问题,笔者在这里只以接收GGA数据为例,格式如下:
$GPGGA,hhmmss,dddmm.mmmm,a,dddmm.mmmm,a,x,xx,x.x,x.x,M,,M,x.x,xxxx*CS
例:$GPGGA,033744,2446.5241,N,12100.1536,E,1,10,0.8,133.4,M,,,,*1F
说明见表:
区域
名称
例
单位
说明
1
信息ID
$GPGGA
[1] [2] [3] [4] [5] [6]
篇4:串口通信读写数据问题,江湖救急!!!!!!!!!!!Windows系统
我现在write串口没问题,但是读串口的数据有问题,如下: 读代码while(1) { while((nread=read(fd,buff,512))0) { buff[nread]=0; } } 串口设备发数据时候,有时候第一次发送可以接收到,第二次发送接受不到(好像是空的)第三次可能收不到,就这样循环,不
我现在write串口没问题,但是读串口的数据有问题,如下:
读代码while(1)
{
while((nread = read(fd,buff,512))>0)
{
buff[nread] =0 ;
}
}
串口设备发数据时候,有时候第一次发送可以接收到,第二次发送接受不到(好像是空的)第三次可能收不到,就这样循环,不知为何
CNL 回复于:-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:11cdma你需要问一下cdma服务方,多长时间不发送数据就拆链,
如联通就是过一段时间没有发送数据就把链路拆了,
你需要在它拆之前发点东西,
串口通信读写数据问题,江湖救急!!!!!!!!!!!Windows系统
,
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机上,而是在方舟的嵌入式板上.
原文转自:www.ltesting.net
篇5:解决网络不通数据只发送不接收
网络的畅通是表现在既有发送包,也有接收包,只有来去都畅通才正常,但是如果只有发送,却没有接收,碰到这样的故障到底又是怎么回事呢?在笔者短暂的两年网管生涯中,出现了几次这样的故障,但他们发生的原因又各有不同。今天笔者就把一些解决方法奉献给大家。
一般来说,出现这种故障的时候,网络连接都是都是好的,即不会出现红色的叉子图标。但这又只是一种表现的正常,因此我们入手的时候必须先从自身入手。
从自身入手的第一点就是检查出现该故障前有没有安装过什么软件,有没有改过什么设置,尤其是杀毒软件、防火墙这一类的软件,因为设置不当就可能出现机器只发送不接收数据包的情况。接下来可以使用“Ping 127.0.0.1”对本地网卡的工作状态进行一个基础的判断,如果能够ping通则证明网卡是正常的。
为了保险起见,建议大家在这种情况下还应该将TCP/IP重新安装一下。打开本地连接的属性窗口,然后单击“安装”按钮,在打开的组件窗口中选中“协议”项并打开添加窗口,选中“Microsoft”下的“Microsoft TCP/IP版本6”将TCP/IP重新安装一下,
再一种情况就是10/100M自适应网卡的问题,尤其是集成网卡的低端机器,出现这种情况时不防将网直接设为10M。打开本地连接的属性窗口,在“常规”中单击网卡的“配置”按钮,切换到“高级”标签,将网速的速率设为10MB即可。
一般来说,对于因为本地机器引发网卡数据只发不接收的原因就是这些了。如果这些问题都排查过了,问题仍然存在,那么则需要继续向下一层查找。
继续向下一层查找问题,就是网络和交换机了。由于网线还是比较脆弱的,八根网线中的某一根很容易出现断裂,但是这时候外表还是很正常的,尤其是负责数据接收的网线出现断裂。为此在确认本机没有问题的情况下,则需要测试、更换网线,这样即可解决问题。
由网线的故障可以引申出交换机的故障,当交换机某个模块或端口出现故障时同样会出现这种情况。因此,我们不防将对应的端口换一个试试,也许能够起到事半功倍的效果。不过对于划分了vlan的网络来说,随意更换端口同样会带来数据只能发不能收的情况,因此在更换的时候必须确定更换前后的端口都在同一个 vlan之中。(www.wzlu.com)
一般来说,遵循由本地开始检查,依次向外扩展,这样很容易就能够解决数据只能发送不能接收的故障。而在处理各种网络故障时,也都应遵循这样的顺序。对于出现的各种问题,大部分都是由于个人体操作不当所引发的,在处理之前先询问一下常常会有意想不到的收获。
★ 谁知道IBM大型机维护人员的工资是多少Windows系统
★ 嵌入式实习总结
★ 用Borland C++3.1实现外设与Windows应用程序实时通信
★ sco unix5.05系统intel pro100+网卡安装心得Windows系统
【串口接收数据,运行一段时间后就接收不到了!Windows系统(共5篇)】相关文章:
课件制作中如何处理音频素材2022-05-06
visual basic程序设计课程教学总结2022-05-12
Excel服务器教程2023-10-20
E5122的家庭网络控制系统2022-05-22
企业无线路由器故障排除2022-05-21
系统安装维护简历2023-06-25
摄像头不能与数码相机共用故障的分析处理2022-08-10
数字签名2023-10-16
DSP与单片机的一种高速通信实现方案2022-05-04
ARM7系统中实现CF卡存储的文件系统设计2023-07-16