1

シリアル デバイスからバッファを読み取りました。これらの結果が返されます(毎回2行)

Hello World.
My name is John.

Hello World.^M^JMy name 
is Mike.

Hello World.^M^JMy name 
is ^M^JERROR Peter.

これらの結果は、Linux コマンド ラインにあります。^M^J は EOL であり、Windows では \r\n を意味します。最初の結果は問題ありませんが、他の 2 つはひどい結果です。^M^J 文字をチェックして削除する方法はありますか? 私はこれらの結果が欲しいので:

Hello World.
My name is John.

Hello World.
My name is Mike.

Hello World.
My name is Peter.

このコードでは、バッファを読み取ります

char buff[150];
memset(buff, 0, sizeof(buff));
for (;;)
{
  n=read(fd,buff,sizeof(buff));
  printf("%s", buff);
}

アップデート

この方法でデバイスを開いて構成します

int open_port(void)
{
int fd; // file description for the serial port 
fd = open("/dev/ttyAMA0", O_RDWR | O_NOCTTY | O_NDELAY);
if(fd == -1) // if open is unsucessful
{
 //perror("open_port: Unable to open /dev/ttyAMA0 - ");
 printf("open_port: Unable to open /dev/ttyAMA0. \n");
}
else
{
  fcntl(fd, F_SETFL, 0);
  printf("port is open.\n");
}

return(fd);
} //open_port

そして、ポートを構成します

int configure_port(int fd)      // configure the port
{
 struct termios port_settings;      // structure to store the port settings in
 cfsetispeed(&port_settings, B9600);    // set baud rates
 cfsetospeed(&port_settings, B9600);
 port_settings.c_cflag &= ~PARENB;    // set no parity, stop bits, data bits
 port_settings.c_cflag &= ~CSTOPB;
 port_settings.c_cflag &= ~CSIZE;
 port_settings.c_cflag |= CS8;
 tcsetattr(fd, TCSANOW, &port_settings);    // apply the settings to the port
 return(fd);

} //configure_port
4

4 に答える 4

0

まず、^M^Jファイルの終わりではなく、行の終わりです。

次に、read指定されたファイル記述子からバイナリ データを読み取ります。ファイルの最後に到達するか、エラーが発生するまで、指定した文字数を読み取ります。一度に行を読み取りたい場合は、一度に 1 バイトずつ読み取るか、他の行指向の I/O 呼び出し (sscanf など) を使用します。

于 2013-06-07T10:44:00.000 に答える
0

ファイルから行を読み取り、Windows のキャリッジ リターンを処理する関数を提案するこの質問を確認できます。

于 2013-06-07T11:54:33.103 に答える
0

でファイルを開きますO_TEXT

#include <fcntl.h>
fd = open("/dev/ttyAMA0", O_RDWR | O_NOCTTY | O_NDELAY | O_TEXT);
于 2013-06-07T13:31:56.677 に答える