我一直在尝试编写一个简单的C代码来使用带有windows的串口,我需要读取行(以\ n + \ r结尾)然后将其保存到文件中。我的问题是我没有找到一个很好的方法。
首先,我需要能够随时关闭串口,所以我决定编写一个多线程程序。好吧,多线程按预期工作,我试图使用OVERLAPED通信,因为NON-OVERLAPED在没有接收数据的情况下永远读取块(记住,我需要随时关闭端口)。
任何人都可以发一个简单的代码从C / C ++的串口读取1行吗?
更新1
我试图写一个类似' SerialReadLine(Handle SerialPort,char Buffer [])的函数;'我使用循环来发出多个ReadFile(每个字节的字节数),直到我收到行结束(\ n + \ r)。
现在我尝试使用非超载的I / O超时,它几乎正常工作,但时间没有:
bool SerialReadLine (const HANDLE *_SerialPort , char String_out[])
{
DWORD ReadBytes;
char BufferSerial[2];
unsigned int CharCount = 0;
while (true)
{
if (ReadFile(*_SerialPort, &BufferSerial, 1, &ReadBytes, NULL))
{
if ((ReadBytes > 0) && (BufferSerial[0] != '\n') && (BufferSerial[0] != '\r'))
{
String_out[CharCount] = BufferSerial[0];
CharCount++;
}
else if (BufferSerial[0] == '\r')
{
String_out[CharCount] = '\0';
return true;
}
}
else //If ReadFile() returns 0, a timeout have ocurred
{
if (!(SerialIsOpen)) return false; //SerialIsOpen is a global
//variable used to close the
//serial port through main thread
}
}
}
并配置超时:
COMMTIMEOUTS timeouts;
timeouts.ReadIntervalTimeout = 10;
timeouts.ReadTotalTimeoutMultiplier = 10;
timeouts.ReadTotalTimeoutConstant = 10;
timeouts.WriteTotalTimeoutMultiplier = 10;
timeouts.WriteTotalTimeoutConstant = 10;
if (!SetCommTimeouts(SerialPort, &timeouts)) //Returns successful
{
printlog (TEXT("Something is wrong!\n\r"));
}