1-й из всех добавляет проверку ошибок к этому вызову:
tcgetattr(fd, &SerialPortSettings);
как
if (0 > tcgetattr(fd, &SerialPortSettings))
{
/* log and handle error */
}
Тогда здесь
SerialPortSettings.c_cflag |= CS8;
вы устанавливаете биты данных.
Две строки под вами очищают его
SerialPortSettings.c_cflag &= ~CSIZE;
Сделайте это наоборот.
Также это
SerialPortSettings.c_cflag &= CSTOPB;
unsets.
Если вы хотите использовать 2 стоповых бита установите , сделав
SerialPortSettings.c_cflag |= CSTOPB;
Вместо того, чтобы просто
SerialPortSettings.c_oflag &= ~OPOST;
сделать
SerialPortSettings.c_oflag = 0;
Код вызывает write()
неправильно.Это
for(j=0;j<4;j++)
{
bytes_written = write(fd,write_buffer[j],sizeof(write_buffer));
должно быть
for(j=0;j<4;j++)
{
bytes_written = write(fd, &write_buffer[j], 1)
Или просто отбросить цикл и сделать
bytes_written = write(fd, write_buffer, sizeof write_buffer);
Вызов read()
также неверен.
Это должно быть
bytes_read = read(fd, read_buffer, ...
Для некоторых из этих ошибок с write
и read
компилятор должен был предупредить вас.
Обратите также внимание, что read()
и write()
возвращают ssize_t
не int
.
Не в последнюю очередь я сомневаюсь, что очистка буфера ввода (tcflush(fd, TCIFLUSH);
) передчтение имеет смысл.