问:
该串口初始化如下
ioctl(comm2Fd,FIOBAUDRATE,9600)
ioctl(comm2Fd,FIOSETOPTIONS,OPT_RAW)
使用如下
FD_ZERO (&readFds);
FD_SET (comm2Fd, &readFds);
width = comm2Fd + 1;
FD_ISSET (comm2Fd, &readFds);
FOREVER
{
if(timeoutvalue==0)
{
printf("\nselect start!\n");
selectnum = select (width, &readFds, NULL, NULL, NULL);
printf("\nselect over!\n");
}
...........
}
现在的状况是程序跑一段时间后会死机或这个串口通讯任务死掉,每次死机都是"select start!"打印出来,而"select over!"打印不出来,在仅这个串口通讯任务死掉的情况下,用comm1Fd超级终端登陆,查询任务状态,会发现tExcTask任务居然处于挂起状态???
哪位大哥帮忙分析一下或给予一点提示,小弟不胜感激!!
答:
select函数在设备读(或写)操作未就绪时应该处于阻塞状态,也就是说你的进程在串口没有收到数据时会处于挂起状态,一旦select监测到有数据可读(或可写如),进程就会转为运行态,继续执行。
从你描述的现象上看,进程本身因该没有当掉,而是底层驱动没有收到数据供应用层读取。不知道你用的是CPU自带串口还是扩展串口。建议你查查串口驱动,有可能的话把中断信号牵出来看看,是不是每次中断都能正确响应。
问:
avbsp您好,我还有一个问题,我上面给出的代码是不是有些问题?
FD_ZERO (&readFds);
FD_SET (comm2Fd, &readFds); 这两句是不是应该写在FOREVER 循环中?
答:
是的。每次都清除
问:
请问,如果不清除,按照我当前的代码来写,会有什么问题吗?能解释一下吗?谢谢
问:
详细函数如下:
static STATUS RecvDataWithTimeOut(UINT16 datacount,UINT16 timeoutvalue)
{
....
....
timeout.tv_sec = timeoutvalue;
timeout.tv_usec = 0;
FD_ZERO (&readFds);
FD_SET (comm2Fd, &readFds);
width = comm2Fd + 1;
FD_ISSET (comm2Fd, &readFds);
FOREVER
{
if(timeoutvalue==0)
selectnum = select (width, &readFds, NULL, NULL, NULL);
else
selectnum = select (width, &readFds, NULL, NULL, &timeout);
if (selectnum == ERROR)
{
#ifdef DEBUG_PRINT
printErr("ERROR:An select error has occurred in received data from COM2!\n");
评论
发表评论