Я установил удаленный микроконтроллер, подключенный к моему ПК с Linux, который выдает непрерывную строку символов. Я настроил порт с помощью screen (выдав screen /dev/ttyS0 57600).
Я проверил данные с помощью команды od и получил то, что ожидал. Данные следуют как 8-битные шестнадцатеричные значения...
0006040 03 01 09 00 00 00 00 00 00 00 00 00 00 00 00 00
0006060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0006100 00 00 00 00 00 00 00 00 00 00 00 06 0b a5 00 03
0006120 01 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0006140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0006160 00 00 00 00 00 00 00 00 00 00 06 0b a5 00 03 01
0006200 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0006220 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0006240 00 00 00 00 00 00 00 00 00 06 0b a5 00 02 01 09
0006260 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0006300 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0006320 00 00 00 00 00 00 00 00 0f 0c a5 00 02 01 09 00
0006340 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0006360 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0006400 00 00 00 00 00 00 00 0f 0c a5 00 02 01 09 00 00
0006420 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0006440 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0006460 00 00 00 00 00 00 0f 0c a5 00 01 01 09 00 00 00
0006500 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0006520 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0006540 00 00 00 00 00 05 0c a5 00 01 01 09 00 00 00 00
0006560 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0006600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0006620 00 00 00 00 05 0c a5 00 01 01 09 00 00 00 00 00
0006640 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0006660 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0006700 00 00 00 05 0c a5 01 08 01 09 00 00 00 00 00 00
Затем я создаю простую программу на C, чтобы попытаться прочитать те же данные, но все, что я получаю от своей программы на C, — это следующий вывод:
a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1
a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1
a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1
a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1
a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1
a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1
a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1
a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1 a5:1
a5:1
Основываясь на этом выводе, кажется, что функция чтения действительно возвращает, что считывается один байт, но каждый раз, когда возвращается значение a5, которое является флаговым байтом, микро отправляет на ПК, чтобы указать новый поток данных фиксированного размера.
Так что моя программа правильно перезаписывает существующее значение "A" в буфере чтения, но ей нужно постоянно обновлять правильные данные (будь то 00 или 01), а не только только a5
Что я делаю не так?
Я приложил полный код ниже, чтобы кто-то мог использовать его, если он хочет попытаться воспроизвести проблему. и да, я правильно настроил бод, биты данных и стоповые биты.
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <time.h>
#include <unistd.h>
#define TIMEOUT 5
int main(){
char inb[3]; //our byte buffer
int nread=0; //number bytes read from port
int n; //counter
int iosz=128; //Lets get 128 bytes
int fd=open("/dev/ttyS0",O_NOCTTY | O_RDONLY | O_SYNC); //Open port
for(n=0;n<iosz;n++){
int s=time(NULL); //Start timer for 5 seconds
while (time(NULL)-s < TIMEOUT && nread < 1){
inb[0]='A'; //Fill buffer with bad data
inb[1]='B';
inb[2]='C';
nread=read(fd,inb,1); //Read ONE byte
if (nread < 0 || time(NULL)-s >= TIMEOUT){
close(fd); //Exit if read error or timeout
return -1;
}
}
printf("%x:%d ",inb[0] & 0xFF,nread); //Print byte as we receive it
}
close(fd); //program ends so close and exit
return 0;
}