Задать вопрос
2ball
@2ball
Хардкор кодер

Какого, собственно, чуда Arduino по китайски заговорил?

Доброго.
Проблема вот в чем. Некоторое количество времени бился над протоколом общения между 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;
  • Вопрос задан
  • 5241 просмотр
Подписаться 4 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
Altf1
@Altf1
Скорость обмена данными с обеих сторон одинаковая?
Ответ написан
2ball
@2ball Автор вопроса
Хардкор кодер
Ну в Delphi настройка проводится:

//Настройка соединения с портом
if not GetCommState(BoardPortHandle, Dcb) then
 Form2.RichEdit1.Lines.Add('Ошибка получения настроек порта');

    Dcb.BaudRate := CBR_9600;
    Dcb.Parity := NOPARITY;
    Dcb.ByteSize := 8;
    Dcb.StopBits := ONESTOPBIT;

if not SetCommState(BoardPortHandle, Dcb) then
 Form2.RichEdit1.Lines.Add('Ошибка настройки порта')
 else Form2.RichEdit1.Lines.Add('Порт настроен');


А в Arduino кроме как настроек скорости я не нашел. Их вроде бы и нет, судя по Сайту Arduino
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы