私の場合、通信タイムアウトを に設定することでこれを解決しました{MAXDWORD,0,0,0,0}
。
これに何年も苦労した後、まさにこの日、MicrosoftのCDCクラスUSB UARTドライバー(USBSER.SYS、現在Windows 10に組み込まれており、実際に使用できるようになっています)を使用して、シリアル通信端末を十分に高速にすることができました。
どうやら、前述の値のセットは、最小限のタイムアウトと最小限の待ち時間を設定する特別な値であり (少なくとも Microsoft ドライバーでは、とにかく私にはそう思われます)、新しい文字が受信にない場合は ReadFile がすぐに返されるようにします。バッファ。
ポートを開くコードは次のとおりです (Visual C++ 2008、ポート名の LPCWSTR 型キャストの問題を回避するために、プロジェクトの文字セットが「Unicode」から「未設定」に変更されました)。
static HANDLE port=0;
static COMMTIMEOUTS originalTimeouts;
static bool OpenComPort(char* p,int targetSpeed) { // e.g. OpenComPort ("COM7",115200);
char portname[16];
sprintf(portname,"\\\\.\\%s",p);
port=CreateFile(portname,GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);
if(!port) {
printf("COM port is not valid: %s\n",portname);
return false;
}
if(!GetCommTimeouts(port,&originalTimeouts)) {
printf("Cannot get comm timeouts\n");
return false;
}
COMMTIMEOUTS newTimeouts={MAXDWORD,0,0,0,0};
SetCommTimeouts(port,&newTimeouts);
if(!ComSetParams(port,targetSpeed)) {
SetCommTimeouts(port,&originalTimeouts);
CloseHandle(port);
printf("Failed to set COM parameters\n");
return false;
}
printf("Successfully set COM parameters\n");
return true;
}
static bool ComSetParams(HANDLE port,int baud) {
DCB dcb;
memset(&dcb,0,sizeof(dcb));
dcb.DCBlength=sizeof(dcb);
dcb.BaudRate=baud;
dcb.fBinary=1;
dcb.Parity=NOPARITY;
dcb.StopBits=ONESTOPBIT;
dcb.ByteSize=8;
return SetCommState(port,&dcb)!=0;
}
そして、これが動作しているUSBトレースです。OUT トランザクション (出力バイト) に続いて IN トランザクション (入力バイト)、さらに OUT トランザクション (出力バイト) がすべて 3 ミリ秒以内に発生することに注意してください。

最後に、これを読んでいる場合は、UART 経由で文字を送受信する関数に興味があるかもしれません。
unsigned char outbuf[16384];
unsigned char inbuf[16384];
unsigned char *inLast = inbuf;
unsigned char *inP = inbuf;
unsigned long bytesWritten;
unsigned long bytesReceived;
// Read character from UART and while doing that, send keypresses to UART.
unsigned char vgetc() {
while (inP >= inLast) { //My input buffer is empty, try to read from UART
while (_kbhit()) { //If keyboard input available, send it to UART
outbuf[0] = _getch(); //Get keyboard character
WriteFile(port,outbuf,1,&bytesWritten,NULL); //send keychar to UART
}
ReadFile(port,inbuf,1024,&bytesReceived,NULL);
inP = inbuf;
inLast = &inbuf[bytesReceived];
}
return *inP++;
}
大規模な転送は、コードの別の場所で処理されます。
最後に、どうやらこれは、1998 年に DOS を放棄して以来、私が書くことができた最初の高速 UART コードです。
これは私が関連情報を見つけた場所です: http://www.egmont.com.pl/addi-data/instrukcje/standard_driver.pdf