Доброго.
Проблема вот в чем. Некоторое количество времени бился над протоколом общения между Delphi и Arduino. Тырнет помог с WinAPI, форумы, хелпдески и прочие прелести поиска решений. В общем отправку / получение вроде бы наладил. Arduino упорно отказывалась читать то, что я ей отправляю. И решил я проверить, что таки ей приходит. Отправил
Low — пришел китайский символ. Хм… Подумал, что могу ошибаться в отправке и прописал в скетче на отправку слово
string. Пришла триада из китайских символов.
Гугл отказался помочь. Дельного ничего нет. Может, Вы товарищи, что-нибудь, да знаете об этой проблеме?
Скетч
String inString;
int inChar;
void setup() {
Serial.begin(9600); // устанавливаем последовательное соединение
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
digitalWrite(12, HIGH);
digitalWrite(11, LOW);
}
void loop() {
while (Serial.available() > 0) {
int inChar = Serial.read();
inString += (char)inChar;
delay(2);
}
if (inString != "") {
Serial.print("String");
inString = "";
}
/*
if (inString == "L") {
digitalWrite(12, LOW);
inString = "";
}
if (inString == "H") {
digitalWrite(12, HIGH);
inString = "";
}
*/
}
Delphi чтение
var
Form2: TForm2;
BoardPortHandle: THandle; //Хендл порта, который открываем для работы
BoardConnectedStatus: boolean; //Состояние соединения с портом
BoardPortNumber: PWideChar; //Номер порта в который отправляется команда
implementation
{$R *.dfm}
procedure TReadPortThread.Execute;
var
ComStat: TComStat;
dwMask, dwError: DWORD;
OverRead: TOverlapped;
Buf: array[0..10] of Char;
dwRead: DWORD;
begin
OverRead.hEvent := CreateEvent(nil, True, False, nil);
if OverRead.hEvent = Null then
raise Exception.Create('Error creating read event');
FreeOnTerminate := True;
while not Terminated do
begin
if not WaitCommEvent(BoardPortHandle, dwMask, @OverRead) then
begin
if GetLastError = ERROR_IO_PENDING then
WaitForSingleObject(OverRead.hEvent, INFINITE)
else
Form2.RichEdit1.Lines.Add('Ошибка создания события чтения');
end;
if not ClearCommError(BoardPortHandle, dwError, @ComStat) then
Form2.RichEdit1.Lines.Add('Ошибка очистки порта');
dwRead:= ComStat.cbInQue;
if dwRead > 0 then
begin
if not ReadFile(BoardPortHandle, Buf, dwRead, dwRead, @OverRead) then
Form2.RichEdit1.Lines.Add('Ошибка чтения порта');
//Обработка полученных данных
ReadenChars:=Buf;
Synchronize(GetChars);
end;
end;
end;