Чтение com портов на С++

344
22 июля 2022, 08:30

Есть ардуина и подключенный к ней датчик (какой, роли не играет) он подает данные на ардуино, а она соответственно на пк. Мне нужно написать код на с++ что бы выводили эти значения.

Нашел на просторах интернета данный код он запускается, но не выводит значения.

#include <windows.h>
#include <stdio.h>
void main()
{
HANDLE port = CreateFile(L"COM3", GENERIC_READ | GENERIC_WRITE, 0, NULL,
                        OPEN_EXISTING, 0, NULL);
unsigned char dst[1024] = {0};
 
unsigned long size = sizeof(dst);
unsigned long recv;

    COMMTIMEOUTS CommTimeOuts;
    CommTimeOuts.ReadIntervalTimeout = 5;
    CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
    CommTimeOuts.ReadTotalTimeoutConstant = 0;
    CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
    CommTimeOuts.WriteTotalTimeoutConstant = 0;
if(SetCommTimeouts(port, &CommTimeOuts) == 0)
{
     puts("Error of SetCommTimeouts");
}
if(port!= INVALID_HANDLE_VALUE)
{
        int i;
        for (i=1; i< 10; i++)
        {
            if(ReadFile(port,dst,size, &recv,0))
            {
                if(recv > 0) {
                    printf("Read %d bytes\n",recv);
                    printf("%s\n", dst);
                }
            }
            printf("%i\r", i);
        }
}      
else
{
    puts("Error of Handler - INVALID_HANDLE_VALUE");
}
 }

И код на arduino

int sensorpin = A0;
void setup() {
Serial.begin(115200);
}
void loop() {
float sensorValue = analogRead(sensorpin);
byte data = Serial.read();
if (data == 's')
 {
  Serial.println(sensorValue);
  delay(10);
 }
}

Ранее писал это действие на питоне и все работало, а как на с++ это сделать не понимаю.

import time
import matplotlib.pyplot as plt
import serial
port = serial.Serial('COM4', 115200, timeout=0.5)
plt.ion()
while (True):
    port.write(b's')
    if (port.inWaiting()):
        value = port.readline()
        print(value)
        number = float(value)
        print(number)
        time.sleep(1)
Answer 1

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

Код на С++

   #include "stdafx.h"
    #include <Windows.h>
    #include <iostream>
    using namespace std;
    HANDLE hSerial;
    void ReadCOM()
    {
      DWORD iSize;
      char sReceivedChar;
      while (true)
      {
            ReadFile(hSerial, &sReceivedChar, 1, &iSize, 0);
            if (iSize > 0)
                cout << sReceivedChar;
      }
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
    LPCTSTR sPortName = L"COM3";  
    hSerial = ::CreateFile(sPortName,GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);

    DCB dcbSerialParams = {0};
    dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
    dcbSerialParams.BaudRate=CBR_9600;
    dcbSerialParams.ByteSize=8;
    dcbSerialParams.StopBits=ONESTOPBIT;
    dcbSerialParams.Parity=NOPARITY;
    
    while(1)
    {
        ReadCOM();
    }
    return 0;
    }

Код на ардуино

    int photocellPin = 0;
    int photocellReading;
    void setup(void) {
    Serial.begin(9600);
     }
    void loop(void) {
    photocellReading = analogRead(photocellPin);
    Serial.println(photocellReading);
    delay(100);
    }
READ ALSO
Инициализация вектора объектов (с конструктором, принимающим значения), являющегося членом класса

Инициализация вектора объектов (с конструктором, принимающим значения), являющегося членом класса

Количество объектов класса MCP в векторе _rheos заранее неизвестноstd::vector использую впервые

346
Почему g++-10 не может использовать ключевые слова связанные с корутинами, хотя 20 стандарт включен и необходимый флаг выставлен?

Почему g++-10 не может использовать ключевые слова связанные с корутинами, хотя 20 стандарт включен и необходимый флаг выставлен?

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

289
Создание shared_ptr через make_shared и через new

Создание shared_ptr через make_shared и через new

Создание std::shared_ptr через std::make_shared может быть полезным в следующем случае:

368
Флаги и манипуляторы форматирования

Флаги и манипуляторы форматирования

У меня есть переменная double d = 123321

226