Komunikasi port serial di linux mengembalikan jawaban yang salah

Saya mencoba membuat program linux ubuntu yang akan membaca data dari port serial tty (port COM di windows). Saya tidak menggunakan adaptor USB tetapi port COM sebenarnya. Ini kode komunikasi saya sejauh ini:

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");
}

Saya punya beberapa masalah di sini:

  1. Setelah saya menjalankan program setelah dijalankan dengan benar tetapi ketika saya mencoba menjalankannya lagi, program berhenti di "Saya sedang membaca data..." dan tidak dapat dimulai bahkan setelah saya me-restart komputer. Setelah beberapa waktu, saya dapat menjalankan program lagi.
  2. Setelah program mengembalikan data, ia akan mengirimi saya data hex seperti A7, 9F dll. tetapi ini memberi saya nilai integer.
  3. Haruskah saya dan bagaimana cara menghapus array buffer untuk mengosongkan memori

Adakah yang bisa membantu mengatasi masalah ini?


person user2081328    schedule 26.02.2014    source sumber


Jawaban (1)


'int n = baca(fd, penyangga, ukuran(buffer));' mengembalikan jumlah byte yang dibaca dalam n, yang kemudian Anda abaikan, (selain memeriksa nilai kesalahan negatif), dan menganggap buffer telah terisi penuh. Ini merupakan kesalahan karena recv(), secara umum, tidak menunggu jumlah byte yang diminta karena port serial menyediakan aliran byte, bukan 'buffer' atau 'pesan'.

printf("Heksa: %x\n", penyangga[i]); akan menampilkan bilangan bulat karena Anda menentukan bilangan bulat dengan %x. Perhatikan dengan SEKSAMA kode format printf.

person Martin James    schedule 26.02.2014
comment
Saya tidak yakin saya memahaminya dengan benar. Kode saya tidak melewati ini sehingga array buffer tidak terisi sepenuhnya, hanya berhenti di sini jadi saya tidak dapat melakukan apa pun dengan n. Selain itu, saya tidak tahu berapa banyak byte yang akan disediakan port, hanya saja tidak lebih dari 64 jadi apakah ada cara untuk memeriksa jumlah byte yang saya terima. Dalam program c# saya telah melakukan sesuatu seperti ini: array[] buf = new array[port.BytesToRead]; port.baca(buf); - person user2081328; 26.02.2014
comment
Saya sudah mencoba mengomentari baris dengan membaca dan menulis dan program berfungsi (tentu saja salah) sehingga sepertinya tidak membaca atau menulis data apa pun ke port serial dan sebaliknya. Apa yang salah dengan pengaturan saya??? - person user2081328; 26.02.2014