ここで関連するすべての質問を読みましたが、解決策が見つかりませんでした。無限ループ外でSerialReadがうまく動作しない
シリアルポートから1バイトずつ読み取ろうとしています。
- 私は無限ループで、いくつかのバイトが利用可能であるかどうかをチェックすると、常にうまく動作し、それまでに送信したものを表示します。
- しかし、私は無限ループの外側をチェックすると、ただ1バイトをキャッチして表示し、シリアルポートを閉じます。ここで
それはそう起こらない理由私は理解していない私のコード
// Checks if 1 data byte is available in the RX buffer at the moment
int serialHasChar(int fd)
{
struct pollfd fds;
fds.fd = fd;
fds.events = (POLLIN | POLLPRI); // POLLIN : There is data to read, POLLPRI: There is urgent data to read
if(poll(&fds, 1, 0) > 0)
{
return 1;
}
else
{
return 0;
}
}
int serialOpen(const char *port, const uint baud)
{
int fd = -1;
fd = open(port, O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1)
{
printf("[ERROR] Couldn't open port \"%s\": %s\n", port, strerror(errno));
return -1;
}
else
{
printf("Serial port %s successfully opened\n", port);
}
struct termios options;
tcgetattr(fd, &options); // Get the current attributes of the Serial port
options.c_iflag = IGNPAR;
options.c_oflag = 0;
options.c_lflag = 0;
options.c_cflag = B115200 | CS8 | CLOCAL | CREAD;
tcflush(fd, TCIFLUSH);
tcsetattr(fd, TCSANOW, &options);
return fd;
}
void serialClose(int fd)
{
tcflush(fd, TCIOFLUSH);
close(fd);
printf("Serial port successfully closed\n");
}
// Receive one byte
uint8_t serialReadChar(int fd)
{
uint8_t ch;
//tcflow(fd, TCOON);
read(fd, &ch, 1);
//tcflow(fd, TCOOFF);
printf("One byte received : 0x%.2x\n", ch);
return ch;
}
int main()
{
uint8_t bytes = 0;
uint8_t ch = 0;
// Open serial port
int fd = serialOpen("/dev/ttyAMA0", 115200);
// This works
while(1)
{
if (serialHasChar(fd)) {
ch = serialReadChar(fd);
}
}
/* This doesn't work
while(serialHasChar(fd) == 0);
while(serialHasChar(fd))
{
ch = serialReadChar(fd);
bytes++;
//bytes = serialNumOfAvailableBytes(fd);
}
*/
serialClose(fd);
return 0;
}
です!誰か助けてくれますか? おかげ
UPDATE: 私は
機能の結果をチェックしてみませんか? – Olaf
最新のコンピュータは高速ですが、シリアルポートは遅いです。したがって、1バイトを読み込むと、serialHasChar()は再びfalseになります。 whileループは終了します。 –
@Olaf、ご返信ありがとうございます。私はその機能の結果を読んだ。動作すると、受信したすべてのバイト数が表示されます。そうでない場合は、最初に受信したバイトが表示されます。私はあなたが正しくなることを願っています。 –