[英]serial port Reading in c++
我試圖用C ++編寫代碼以從串行端口讀寫,我寫了以下代碼,現在我試圖通過在USB到串行電纜上進行回送來測試這一點,當我寫除零以外的任何東西時,我都成功讀取了,但是當寫入零時,程序停止讀取並且不讀取零后的任何東西,並且在顯示讀取緩沖區時給我零(在該程序中,它顯示讀取緩沖區的零,但是如果我寫任何東西,例如使寫循環寫“ words = 127-我”,閱讀器緩沖區將顯示我所寫的全部內容,直到達到零為止)請迅速提供幫助
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <commdlg.h>
#include <iostream>
//#include <windef.h>
using namespace std;
int nread,nwrite;
void main()
{
HANDLE hSerial;
COMMTIMEOUTS timeouts;
COMMCONFIG dcbSerialParams;
char words[128], *buffWrite;
DWORD dwBytesWritten, dwBytesRead;
hSerial = CreateFile(TEXT("COM1"),GENERIC_READ |GNERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hSerial == INVALID_HANDLE_VALUE)
{
if (GetLastError() == ERROR_FILE_NOT_FOUND)
{
printf(" serial port does not exist \n");
}
printf(" some other error occured. Inform user.\n");
}
// DCB dcbSerialParams ;
//GetCommState( hSerial, &dcbSerialParams.dcb);
if (!GetCommState(hSerial, &dcbSerialParams.dcb))
{
printf("error getting state \n");
}
dcbSerialParams.dcb.DCBlength = sizeof(dcbSerialParams.dcb);
dcbSerialParams.dcb.BaudRate = CBR_2400;
dcbSerialParams.dcb.ByteSize = 8;
dcbSerialParams.dcb.StopBits = ONESTOPBIT;
dcbSerialParams.dcb.Parity = NOPARITY;
dcbSerialParams.dcb.fBinary = TRUE;
dcbSerialParams.dcb.fDtrControl = DTR_CONTROL_ENABLE;
dcbSerialParams.dcb.fRtsControl = RTS_CONTROL_ENABLE;
dcbSerialParams.dcb.fOutxCtsFlow = TRUE;
dcbSerialParams.dcb.fOutxDsrFlow = TRUE;
dcbSerialParams.dcb.fDsrSensitivity= FALSE;
dcbSerialParams.dcb.fAbortOnError = TRUE;
if(!SetCommState(hSerial, &dcbSerialParams.dcb))
{
printf(" error setting serial port state \n");
}
SetCommMask( hSerial,EV_RXCHAR);
GetCommTimeouts(hSerial,&timeouts);
//COMMTIMEOUTS timeouts = {0};
timeouts.ReadIntervalTimeout = 50;
timeouts.ReadTotalTimeoutConstant = 50;
timeouts.ReadTotalTimeoutMultiplier = 10;
timeouts.WriteTotalTimeoutConstant = 50;
timeouts.WriteTotalTimeoutMultiplier= 10;
if(!SetCommTimeouts(hSerial, &timeouts))
{
printf("error setting port state \n");
}
// printf("This is a string to be written to serial port COM1 \n\n\n");
//****************Write Operation*********************//
//words = "This is a string to be written to serial port COM1";
//dwBytesWritten=1;
cout<<"Data written to write buffer is \n";
for(int i=0;i<128;i++)
{
words[i]=i;
cout<<(int)words[i]<<",";
}
cout<<endl;
nwrite = strlen(words);
buffWrite = words;
dwBytesWritten = 0;
if (!WriteFile(hSerial, buffWrite, nwrite, &dwBytesWritten, NULL))
{
printf("error writing to output buffer \n");
}
//***************Read Operation******************//
char buffsRead[128]="0",*buffRead;
dwBytesRead = 0;
nread = strlen(buffsRead);
buffRead = buffsRead;
//ReadFile(hSerial, buffRead, nread, &dwBytesRead, NULL);
if (!ReadFile(hSerial, buffRead, nread, &dwBytesRead, NULL))
{
printf("error reading from input buffer \n");
}
// printf("Data read from read buffer is \n %s \n",(int)buffsRead);
cout<<"Data read from read buffer is \n ";
for(int j=0;j<128;j++)
{
cout<<(int)buffsRead[j]<<",";
}
cout<<endl;
CloseHandle(hSerial);
// system("PAUSE");
}
問題在於您要計算的字節數。 你有
nwrite = strlen(words);
並且這不適用於二進制數據,因為strlen
在第一個'\\0'
(NUL字符)處停止。
只需在循環中調整nwrite
,使其最終增加所添加的字符數。 更換
words[i]=i;
與
words[nwrite++] = i;
並擺脫nwrite = strlen(words);
一切都會更好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.