Проблема с последовательной связью C в Windows

#c #windows #arduino #serial-port

#c #Windows #arduino #последовательный порт

Вопрос:

Я пытаюсь связаться с Arduino, используя C в Windows.

Arduino ожидает номер и загорится количество светодиодов, указанное полученным номером. Я могу успешно открыть порт и отправить данные на Arduino, однако наблюдается некоторое странное поведение.

Когда я использую встроенную последовательную консоль в Arduino IDE и отправляю, например, «8», Arduino реагирует правильно. (Отправляемые 38 0A данные соответствуют последовательному анализатору).

Когда я запускаю свой код на C , данные также отправляются 38 0A , однако Arduino на это не реагирует.

Мой код C на стороне ПК:

 #include <Windows.h>
#include <iostream>


bool write(void* data, int len)
{
    HANDLE hPort;
    hPort = CreateFile("\\.\COM4", GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

    DCB dcb = { 0 };
    dcb.DCBlength = sizeof(dcb);

    DWORD byteswritten;

    if (!GetCommState(hPort, amp;dcb)) return false;

    dcb.BaudRate = CBR_115200;
    dcb.ByteSize = 8;
    dcb.Parity = NOPARITY;
    dcb.StopBits = ONESTOPBIT;

    if (!SetCommState(hPort, amp;dcb)) return false;

    bool retVal = WriteFile(hPort, data, len, amp;byteswritten, NULL);
    CloseHandle(hPort);
    return retVal;
}

int main() 
{
    char lpBuffer[] = "8n";
    if (write(lpBuffer, strlen(lpBuffer))) {
        std::cout << "Success" << std::endl;
    }
    else {
        std::cout << "Error" << std::endl;
    }

    return 0;
}
  

И вот код Arduino, хотя я предполагаю, что проблема будет на стороне ПК…

 #define BAUD 115200

int pins[] = {A5, A4, A3, 2, 4, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13};
int count = 0;

void setup() {
  Serial.begin(BAUD);
  
  for(int pin : pins) {
    pinMode(pin, OUTPUT);
  }
}

void updateLeds(int cnt) {
  if(cnt > sizeof(pins)) cnt = sizeof(pins);

  for(int pin : pins) {
    digitalWrite(pin, LOW);
  }

  for(int i = 0; i < cnt; i  ) {
    digitalWrite(pins[i], HIGH);
  }
}

void loop() {
  if(Serial.available() > 0) {      
    Serial.println("[RECV]");
    count = Serial.parseInt();
    Serial.read();
  }
  updateLeds(count);

  delay(50);
}
  

Комментарии:

1. Вы не устанавливаете нигде рядом со всеми важными элементами DCB , что означает, что вы находитесь во власти настройки конфигурации последней программой, использующей последовательный порт.

2. Когда вы говорите «отправленные данные также 38 0A», означает ли это, что вы видели, как данные поступают через последовательный порт? Или просто это то, что находится в буфере, который вы передали WriteFile ? Если ваши настройки flowcontrol и квитирования неверны, КОМПЬЮТЕР фактически никогда не будет передавать данные.

3. @BenVoigt я видел данные через последовательный анализатор. Это 38 0A и ничего больше…

4. Попробуйте включить DTR

Ответ №1:

Как упоминал Джулиан в комментариях, включение DTR сделало свое дело.

 ...
dcb.fDtrControl = DTR_CONTROL_HANDSHAKE;
...