Windows串口读取线

时间:2014-04-29 17:34:08

标签: windows serial-port

我一直在尝试编写一个简单的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"));
}

0 个答案:

没有答案