Я пытаюсь отправить данные с потенциометра в программу на C, работающую на моем ПК с Windows 10, через Arduino Uno (для отправки данных) и Windows API (для чтения данных с USB-последовательного порта).Программа на C не обнаруживает строку, которую посылает Arduino, и следующая отправленная строка приводит к повреждению первой.
Кажется, что у монитора Arduino Serial нет этих проблем, так что это должна быть программа на C, верно?Программа на C представляет собой слегка отредактированную версию этого урока by xanthium .
//create file
HANDLE hComm;
char ComPortName[] = "\\\\.\\COM3";
hComm = CreateFile(ComPortName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if(hComm == INVALID_HANDLE_VALUE)
{
printf("Error! Port %s can't be opened.\n", ComPortName);
return 1;
}
printf("Port opened.\n");
//port parameters
dcbSerialParams.BaudRate = 9600;
dcbSerialParams.ByteSize = 8;
dcbSerialParams.StopBits = 1;
dcbSerialParams.Parity = 0;
//timeouts
timeouts.ReadIntervalTimeout = 50;
timeouts.ReadTotalTimeoutConstant = 50;
timeouts.ReadTotalTimeoutMultiplier = 10;
timeouts.WriteTotalTimeoutConstant = 50;
timeouts.WriteTotalTimeoutMultiplier = 10;
//comm mask
Status = SetCommMask(hComm, EV_RXCHAR);
if(Status == FALSE)
{
printf("Error in setting CommMask.\n");
return 1;
}
//reception
printf("Waiting for data reception...\n\n");
Status = WaitCommEvent(hComm, &dwEventMask, NULL);
if(Status == FALSE)
{
printf("Error in setting WaitCommEvent()\n");
return 1;
}
printf("Characters received!\n");
//read file
do
{
Status = ReadFile(hComm, &TempChar, sizeof(TempChar), &NoBytesRead, NULL);
SerialBuffer[i] = TempChar;
i++;
}
while(NoBytesRead > 0);
//print data
for(int j = 0; j < i-1; j++) printf("%c", SerialBuffer[j]);
printf("\n\n");
//close comm
CloseHandle(hComm);
system("pause");
return 0;
}
Программа работает отлично, Arduino Uno сбрасывается при открытии последовательного порта, Arduino отправляет строку и ... ничего.Программа останавливается на
Status = WaitCommEvent(hComm, &dwEventMask, NULL);
Строка не обнаружена.Однако, если строка отправляется снова, следующая отправленная строка повреждает первую строку.
Arduino будет отправлять 638
, но программа C не зарегистрирует ее, тогда другая 638
и программа C будутзарегистрируйте его как 63638
или ��638
.