Я пытаюсь создать программу Linux Ubuntu, которая будет считывать данные с последовательного порта tty (COM-порт в Windows). Я использую не USB-адаптер, а настоящий COM-порт. Это мой код для связи до сих пор:
int OpenPort(void)
{
int fd; // file description for sp
fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_SYNC);
if(fd == -1) // port not opened
{
printf("Error:\n%s.\n", strerror(errno));
}
else
{
fcntl(fd, F_SETFL, 0);
printf("Success.\n");
}
return(fd);
} // Open sp
void Communicate(void)
{
struct termios settings;
tcgetattr( fd, &settings );
cfsetispeed(&settings, B9600); // Set bouds
cfsetospeed(&settings, B9600);
settings.c_cflag &= ~PARENB; // set no parity, stop bits, data bits
settings.c_cflag &= ~CSTOPB;
settings.c_cflag &= ~CSIZE;
settings.c_cflag |= CS8;
tcflush( fd, TCIFLUSH );
if (tcsetattr(fd, TCSAFLUSH, &settings)!= 0)
{
printf("Error message");
}
//Create byte array
unsigned char send_bytes[] = { 0x1, 0x6, 0x2, 0xAA, 0x2, 0x3, 0xB8, 0x4 };
write(fd, send_bytes, sizeof(send_bytes)); // Send data
printf("Data sent. \n");
char buffer[64]; // buffer to receive data
printf("I'm reading data...\n");
int n = read(fd, buffer, sizeof(buffer));
if (n < 0)
printf("Failed to read\n");
int i;
printf("Showing data...\n");
for(i=0; i<sizeof(buffer); i++)
{
printf("Hex: %x\n", buffer[i]);
}
printf("Closing...\n");
close(fd);
printf("All done!\n");
}
У меня тут несколько проблем:
- После того, как я запускаю программу один раз, она выполняется правильно, но когда я пытаюсь запустить ее снова, она останавливается на «Я читаю данные ...» и не запускается даже после перезагрузки компьютера. Через некоторое время это позволяет мне снова выполнить программу.
- После того, как программа вернет данные, она должна отправить мне шестнадцатеричные данные, такие как A7, 9F и т. Д., Но это дает мне целые значения.
- Должен ли я и как очистить буферный массив, чтобы освободить память
Кто-нибудь может помочь с этими проблемами?