Чтение последовательных данных с 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    

, 👍0

Обсуждение

Имеет ли 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


1 ответ


1

RS232 использует +/- 12 В (или иногда +/- 5 В) и несовместим с последовательным интерфейсом TTL, который использует 0 В/5 В. Также +12 В в RS232 представляет собой 0, а -12 В представляет 1; инвертировано по сравнению с обычным значением TTL.

,