Предпосылки: Это часть более широкой прикладной программы прикладной программы, которая находится всего на шаге дальше от успеха, и задача о проблеме представлена в самом заголовке. me.
Серийное устройство - это Microcontroler cp2102 и atmega32a , отправляющий строку на компьютер через драйвер, который читается в моем применении в порте
Теперь настало время уместить утверждение задачи. Мое заявление имеет бод в 9600, Charecter в 8 -битном, без паритета и 1 стоп -бита. Функция createfile () от используется для открытия порта. Моя индивидуальная консоль работала довольно хорошо, пока я ошибочно не открыл неверный порт Com1, в то время как устройство было установлено в COM4. После этой единственной ошибки функция порта, особенно затем функция CreateFile (), кажется, застряла в положении тупика, которая идеально открывает порт, но не сможет прочитать входящие данные. Короче говоря, если правильный порт открывается в первый раз, вам нравится идти! В противном случае вы испорчены! Порт открывается без какого -либо сообщения об ошибке во второй раз после того, как ошибка была совершена, но входящие данные не читаются и, следовательно, застряли , и если приложение не закрыто, и начинается новый сеанс . Все приложение должно быть закрыто и перезаботено, чтобы решить проблему. был соответственно открыт успешно с самой первой попыткой первой сессии приложения. Мой микроконтроллер посылает эту строку «приветствия! ... atmega32a» каждый полсекунды. И чтобы продемонстрировать свою проблему, я намеренно открываю неправильный порт COM1 вместо подходящего com4
, как вы можете видеть, ошибка «порт несоблюдает», и какой приложенный режим, вполне предоставленный «Заявленным». перезапуск. Следующий скриншот доказывает мою точку зрения.
После намеренной ошибки замечено, что порт открыт без какой -либо ошибки на соответствующем порте с помощью вучительного вызова, но не слушает приколинный микроавтобус. Приложение должно быть закрыто и перезаписывается, чтобы избежать этого режима тупика. < /P>
Вот минимальный фрагмент кода: < /p>
DWORD WINAPI USB_SerialBegin(void * args){
wchar_t *COMMNAME = (wchar_t*)args;
wprintf(L"COMMNAME %s\r\n",COMMNAME);
printf("Baud %d\r\n",CBR_9600);
printf("Parity %d\r\n",PARITY_NONE);
printf("StopBit %d\r\n",STOPBITS_10);
printf("Char %d\r\n",8);
DCB SerialConfig;
COMMTIMEOUTS SerialTimeout;
//HANDLE USBSerialHandle;
memset(&SerialConfig,0,sizeof(SerialConfig));
memset(&SerialTimeout,0,sizeof(SerialTimeout));
SerialTimeout.ReadIntervalTimeout = 100;
SerialTimeout.ReadTotalTimeoutMultiplier = 0;
SerialTimeout.ReadTotalTimeoutConstant = 1000;
SerialTimeout.WriteTotalTimeoutMultiplier = 0;
SerialTimeout.WriteTotalTimeoutConstant = 1000;
/*FlushFileBuffers(USBSerialHandle);
PurgeComm(USBSerialHandle,PURGE_RXCLEAR|PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR);
EscapeCommFunction(USBSerialHandle,CLRDTR);
EscapeCommFunction(USBSerialHandle,SETDTR);*/
if(GetFileType(USBSerialHandle)!=FILE_TYPE_UNKNOWN){
CloseHandle(USBSerialHandle);
}
/*if(USBSerialHandle == INVALID_HANDLE_VALUE){
CloseHandle(USBSerialHandle);
}*/
wchar_t COMSTRING[10]={0};
wsprintf(COMSTRING,(wchar_t*)L"\\\\.\\%s",COMMNAME);
USBSerialHandle = CreateFileW(COMSTRING,
GENERIC_READ | GENERIC_WRITE ,
0,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if(USBSerialHandle!=INVALID_HANDLE_VALUE){
TerminalColor(COLR_SUCS);
appendTextToEdit(TerminalConsole,L"PORT HAS BEEN OPENED SUCCESSFULLY!\r\n");
printf("PORT IS OPEN! %d\r\n",GetLastError());
printf("Handle %d\r\n",USBSerialHandle);
}else{
printf("UNRESPONSIVE PORT WITH ERR %d\r\n",GetLastError());
TerminalColor(COLR_FAIL);
appendTextToEdit(TerminalConsole,L"PORT IS UNRESPONSIVE \r\n");
if(GetFileType(USBSerialHandle)!=FILE_TYPE_UNKNOWN){
CloseHandle(USBSerialHandle);
}
CloseHandle(USBSerialHandle);
Sleep(100);
return 0;
MessageBoxW(Wmain,(wchar_t*)L"The PORT is unresponsive\r\n",USBSerialInfo.COMM,MB_OK|MB_ICONERROR);
}
SerialConfig.DCBlength = sizeof(SerialConfig);
if(!GetCommState(USBSerialHandle,&SerialConfig)){
TerminalColor(COLR_FAIL);
appendTextToEdit(TerminalConsole,L"GetCommState() Failure\r\n");
CloseHandle(USBSerialHandle);
return 0;
}
SerialConfig.BaudRate = CBR_9600;
SerialConfig.ByteSize = 8;
SerialConfig.Parity = PARITY_NONE;
SerialConfig.StopBits = STOPBITS_10;
if(!SetCommState(USBSerialHandle,&SerialConfig)){
TerminalColor(COLR_FAIL);
appendTextToEdit(TerminalConsole,L"Configuration | SetCommState() Failure\r\n");
CloseHandle(USBSerialHandle);
return 0;
}else{
TerminalColor(COLR_SUCS);
appendTextToEdit(TerminalConsole,L"Configurations set successfully\r\n");
}
if(!SetCommTimeouts(USBSerialHandle,&SerialTimeout)){
printf("Setting Timeout Failed\r\n");
CloseHandle(USBSerialHandle);
}else{
printf("Setting Timeout Success\r\n");
}
DWORD RecvBytes;
while(1){
if(LoopBreak){
LoopBreak=0;
break;
}
int stat = ReadFile(USBSerialHandle,SocketBuffer,sizeof(SocketBuffer),&RecvBytes,NULL);
if(RecvBytes){
UTF8_Decode((unsigned char*)SocketBuffer,UniCodeRecvBuffer);
TerminalColor(COLR_RECV);
appendTextToEdit(TerminalConsole,UniCodeRecvBuffer);
if(NewLine){
appendTextToEdit(TerminalConsole,L"\r\n");
}
//printf("USBSerial RX %d\r\n",RecvBytes);
memset(SocketBuffer,0,sizeof(SocketBuffer));
memset(UniCodeRecvBuffer,0,sizeof(UniCodeRecvBuffer));
RecvBytes = 0;
}
/*memset(UniCodeSendBuffer,0,sizeof(UniCodeSendBuffer));
memset(UniCodeRecvBuffer,0,sizeof(UniCodeRecvBuffer));
memset(SocketBuffer,0,sizeof(SocketBuffer));*/
}
sleep(100);
FlushFileBuffers(USBSerialHandle);
PurgeComm(USBSerialHandle,PURGE_RXCLEAR|PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR);
CloseHandle(USBSerialHandle);
}
< /code>
nb: < /p>
[*] terminalcolor () < /strong> Функция Устанавливает цвет текста в настраиваемой консоли UI. Это не имеет ничего общего с последовательной логикой.
appendTextToEdit () Функция записывает полученные байты в пользовательский пользовательский интерфейс. /> lopbreak < /strong> - это флаг внутри () цикл, который внезапно разбивает цикл, за которым следует закрытие ручки, когда кнопка закрытия терминала (верхняя справа). Или проблема лежит где -то еще? Что может быть решением этой проблемы без закрытия целого сеанса? Спасибо за вашу корпорацию и с уважением!
Подробнее здесь: https://stackoverflow.com/questions/796 ... ent-of-com
Сериал на Windows затепенно связан с сеансом после неправильного управления COM -портом ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как создать приложение C# Maui Android, которое вставляет сериал в USB OTG Arduino
Anonymous » » в форуме C# - 0 Ответы
- 12 Просмотры
-
Последнее сообщение Anonymous
-