程序在使用Windows 32位串行通信时挂起

时间:2011-01-20 10:45:11

标签: c

下面写的是我为访问串口而编写的粗略代码。连接到该端口的是一个微控制器,它向我发送数据并且波特率为57600.我运行了一次代码并得到了结果但在关闭窗口后,我的计算机被挂起了。我按下了ctrl + alt + del,看到进程下我的程序仍在运行。我也无法关闭它。

int n = 20;
char szBuff[20 + 1] = {0};

HANDLE hSerial;
DCB dcbSerialParams = {0};
COMMTIMEOUTS timeouts={0};
DWORD dwBytesRead = 20;

dcbSerialParams.DCBlength=sizeof(DCB);

hSerial = CreateFile("COM5",
                 GENERIC_READ | GENERIC_WRITE,
                 0,
                 0,
                 OPEN_EXISTING,
                 FILE_ATTRIBUTE_NORMAL,
                 0);


if(hSerial==INVALID_HANDLE_VALUE)
{
  if(GetLastError()==ERROR_FILE_NOT_FOUND)
  {
    puts ("cannot open port!");
  }

  puts ("invalid handle value!");                                 
}

if (!GetCommState(hSerial, &dcbSerialParams)) 
{
  puts ("error getting state");
}

dcbSerialParams.BaudRate=CBR_57600;
dcbSerialParams.ByteSize=8;
dcbSerialParams.StopBits=ONESTOPBIT;
dcbSerialParams.Parity=NOPARITY;

if(!SetCommState(hSerial, &dcbSerialParams))
{
  puts ("error setting port state");
}


while (1)
{

  if(!ReadFile(hSerial, szBuff, n, &dwBytesRead, NULL)){
     puts ("serial read error fail!");
  } 

  else
  {
     printf ("%s\n" , szBuff);
  }

}

2 个答案:

答案 0 :(得分:1)

这听起来像一个有缺陷的串口驱动程序。见Why do some process stay in Task Manager after they've been killed?。当您终止程序时,它将不会消失,直到所有挂起的I / O操作都被取消。

答案 1 :(得分:0)

如果它会在一段时间内循环(1),你必须为应用程序定义某种类型的停止。

选项1:微控制器必须发送一个用于中断的终止命令或字符。

选项2:某些类型的超时而不是(1)。

选项3:抓住一些信号,然后打破while()。

还有很多其他选择。