Чтение последовательных данных с Arduino с помощью кода C
Я пытаюсь получить данные через последовательный порт от моего SBC (TS-7200), я работаю с Linux и обрабатываю последовательную связь с использованием C/C++. Чтобы отправить данные в SBC, я использую Arduino Uno .
По сути, Arduino печатает текстовые данные ASCII через Pin1 (последовательный порт оборудования) в цикле с задержкой 3 мс.
Из SBC я читаю необработанные данные в неканоническом режиме (в приведенном ниже коде указаны параметры и конфигурации последовательного порта). Я пытаюсь читать по одному символу за раз, следуя примеру с этой страницы: https:/с этой страницы/chrisheydrick.com/2012/06/17/how-to-read-serial-data-from-an-arduino-in-linux-with-c-part-3/.
но когда я запускаю код, он печатает число 2 как 3, а число 3 как f, я не могу читать символы ASCII.
Я попробовал несколько вещей, но не смог найти проблему. Надеюсь, кто-нибудь сможет мне помочь.
Вот код Arduino:
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2,3); // RX, TX
void setup() {
Serial.begin(9600);
mySerial.begin(9600);
}
void loop() {
Serial.print(2);
delay(3000);
Serial.print(3);
delay(3000);
}
Код c со стороны Linux:
#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <termios.h>
char *portname = "/dev/ttyAM1";
char buf[256];
int main(int argc, char *argv[])
{
int fd,stop = 0;
/* Open the file descriptor in non-blocking mode */
fd = open(portname, O_RDWR | O_NOCTTY);
/* Set up the control structure */
struct termios toptions;
/* Get currently set options for the tty */
tcgetattr(fd, &toptions);
/* Set custom options */
/* 9600 baud */
cfsetispeed(&toptions, B9600);
cfsetospeed(&toptions, B9600);
/* 8 bits, no parity, no stop bits */
toptions.c_cflag &= ~PARENB;
toptions.c_cflag &= ~CSTOPB;
toptions.c_cflag &= ~CSIZE;
toptions.c_cflag |= CS8;
/* no hardware flow control */
toptions.c_cflag &= ~CRTSCTS;
/* enable receiver, ignore status lines */
toptions.c_cflag |= CREAD | CLOCAL;
/* disable input/output flow control, disable restart chars */
toptions.c_iflag &= ~(IXON | IXOFF | IXANY);
/* disable canonical input, disable echo,
disable visually erase chars,
disable terminal-generated signals */
toptions.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
/* disable output processing */
toptions.c_oflag &= ~OPOST;
/* wait for 1 character to come in before read returns */
/* WARNING! THIS CAUSES THE read() TO BLOCK UNTIL ALL */
/* CHARACTERS HAVE COME IN! */
toptions.c_cc[VMIN] = 1;
/* no minimum time to wait before read returns */
toptions.c_cc[VTIME] = 0;
/* commit the options */
tcsetattr(fd, TCSANOW, &toptions);
/* Wait for the Arduino to reset */
usleep(1000*1000);
/* Flush anything already in the serial buffer */
tcflush(fd, TCIFLUSH);
while(stop == 0){
/* read up to 128 bytes from the fd */
int n = read(fd, &buf, 128);
usleep(3000*1000);
/* print how many bytes read */
printf("%i bytes got read...\n", n);
/* print what's in the buffer */
printf("Buffer contains...\n%s\n", buf);
}
return 0;
}
Вот что я вижу:
2 bytes got read...
Buffer contains...
f
2 bytes got read...
Buffer contains...
3
2 bytes got read...
Buffer contains...
f
2 bytes got read...
Buffer contains...
3
@Pau9, 👍0
Обсуждение1 ответ
RS232 использует +/- 12 В (или иногда +/- 5 В) и несовместим с последовательным интерфейсом TTL, который использует 0 В/5 В. Также +12 В в RS232 представляет собой 0
, а -12 В представляет 1
; инвертировано по сравнению с обычным значением TTL.
- Отключение Arduino при загрузке
- Как связаться с ESP8266 ESP01, отправив данные через программный сериал на Arduino Uno?
- Как отправить символы в SoftwareSerial Arduino с помощью командной строки Linux без хвоста -f?
- Arduino Uno R3 не распознается Arduino IDE в Ubuntu 21.04
- Arduino wrap или подкласс print() для работы с несколькими Serial
- Arduino перестает отправлять/принимать данные через Serialport через случайное время
- Serial печатается дважды?
- Есть ли у Linux защита программного обеспечения на USB?
Имеет ли TS-7200 последовательный интерфейс TTL?, @Juraj
Привет, Юрай, нет, у него нет интерфейса TTL, есть только 3 последовательных интерфейса: ttyAM0 (COM1), ttyAM1 (COM2), ttyAM2 (COM3)., @Pau9
тогда как его подключить к последовательному выводу TTL на Arduino?, @Juraj
У меня есть разъем db9, подключенный к последовательному порту COM2 SBC, используя распиновку r232. Контакт передачи 1 Arduino (TXD) подключен к контакту 2 (RXD) разъема db9, а контакт заземления 5 подключен к земле Arduino., @Pau9
RS232 использует +/- 12 В (или иногда +/- 5 В) и несовместим с последовательным TTL, который использует 0 В/5 В. Также +12 В в RS232 представляет собой «0», а -12 В представляет «1»; инвертировано по сравнению с обычным TTL., @jose can u c
Большое спасибо, Хосе Кан, в этом была проблема., @Pau9