[英]Serial Communication C++ ReadFile()
我創建了2個可通過串行端口進行讀寫的函數,我使用Visual Studio 2012,Windows 7、64位操作系統和RS-232串行線在C ++中進行編碼。 我所連接的電路板應該在按下按鈕時發送5個字符,即TRG 1,該代碼有效,但是輸出並不總是正確的值。
char serialRead()
{
char input[5];
DCB dcBus;
HANDLE hSerial;
DWORD bytesRead, eventMask;
COMMTIMEOUTS timeouts;
hSerial = CreateFile (L"\\\\.\\COM13", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
if (hSerial == INVALID_HANDLE_VALUE)
{
cout << "error opening handle\n";
}
else
{
cout << "port opened\n";
}
dcBus.DCBlength = sizeof(dcBus);
if ((GetCommState(hSerial, &dcBus) == 0))
{
cout << "error getting comm state\n";
}
dcBus.BaudRate = CBR_9600;
dcBus.ByteSize = DATABITS_8;
dcBus.Parity = NOPARITY;
dcBus.StopBits = ONESTOPBIT;
if ((GetCommState(hSerial, &dcBus) == 0))
{
cout << "error setting comm state\n";
}
if ((GetCommTimeouts(hSerial, &timeouts) == 0))
{
cout << "error getting timeouts\n";
}
timeouts.ReadIntervalTimeout = 10;
timeouts.ReadTotalTimeoutMultiplier = 1;
timeouts.ReadTotalTimeoutConstant = 500;
timeouts.WriteTotalTimeoutMultiplier = 1;
timeouts.WriteTotalTimeoutConstant = 500;
if (SetCommTimeouts(hSerial, &timeouts) == 0)
{
cout << "error setting timeouts\n";
}
if (SetCommMask(hSerial, EV_RXCHAR) == 0)
{
cout << "error setting comm mask\n";
}
if (WaitCommEvent(hSerial, &eventMask, NULL))
{
if (ReadFile(hSerial, &input, 5, &bytesRead, NULL) !=0)
{
for (int i = 0; i < sizeof(input); i++)
{
cout << input[i];
}
cout << endl;
}
else
{
cout << "error reading file\n";
}
}
else
{
cout << "error waiting for comm event\n";
}
switch (input[4])
{
case '1' :
CloseHandle(hSerial);
return '1';
break;
case '2' :
CloseHandle(hSerial);
return '2';
break;
case '3' :
CloseHandle(hSerial);
return '3';
break;
case '4' :
CloseHandle(hSerial);
return '4';
break;
case '5':
CloseHandle(hSerial);
return '5';
break;
default :
CloseHandle(hSerial);
return '9';
break;
}
}
在正確配置端口並傳輸數據的意義上,代碼成功運行。 輸出會有所不同,大多數情況下,輸出將打印整個“ TRG 1”,但看起來是隨機的,輸出將是“ TRG |} |}”或“ T |} |} |} |}”,即它將成為字符串的一部分,並且每個丟失的字符都將由“ |}”代替正確的字符。 這是一個問題,因為我希望能夠將其發送給觸發器以不同的值並運行該變量的開關。
我對串行通信比較陌生,而不是專業的程序員,所以我想知道發生了什么嗎?
串行通信不是基於數據包的。 這些信息不是以打包的形式提供給您的,在打包中,必須一次性讀取整個消息。 相反,它是一個流,因此您可以閱讀半條消息,整條消息,多條消息等。
正如zdan在評論中所說,您需要檢查從ReadFile
讀取的字節數,並使用它來構成5個字符的軟件包,這就是您的消息。 具體來說,只有返回返回的讀取字節數的前幾個字符才有效; 其余都是垃圾。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.