串口陷入read()数据

时间:2016-07-31 09:13:11

标签: c linux bluetooth serial-port embedded-linux

我已经将HC-05蓝牙模块连接到microZed板并尝试通过uart在Linux中发送和接收数据,现在当我从我的板发送数据到应用程序时发送代码正常工作它完美地工作在下面是我的发送代码

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include <pthread.h> /* for threads */
#include <termios.h> /* uart */
#include <fcntl.h> /* uart */
#include <unistd.h> /* uart */
#define MODEMDEVICE "/dev/ttyPS1"
int main()
{
 printf("Opening %s\n", MODEMDEVICE);
 int portfd = open(MODEMDEVICE, O_RDWR | O_NOCTTY);
 if (portfd < 0) {
 printf("ERROR coultn't open %s\n", MODEMDEVICE);
 return -1;
 }
 /* set terminal settings */
 struct termios tty;
 tcgetattr(portfd, &tty);

 cfsetospeed(&tty, (speed_t)B9600);
 cfsetispeed(&tty, (speed_t)B9600);
 tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8;
 tty.c_iflag = IGNBRK;
 tty.c_lflag = ICANON;
 tty.c_oflag = 0;
 tty.c_cflag |= CLOCAL | CREAD;
 tty.c_cc[VTIME] = 0;
 tty.c_cc[VMIN] = 1;
 tty.c_iflag &= ~(IXON | IXOFF | IXANY);
 tty.c_cflag &= ~(PARENB | PARODD);
 tty.c_cflag |= PARENB;
 tty.c_cflag &= ~CSTOPB;
 tcsetattr(portfd, TCSANOW, &tty);
 /* sleep a bit */
 usleep(200000);
 /* flush possible characters in the input buffer */
 tcflush(portfd, TCIOFLUSH);
 char buf;

 int i;

 while(1) {

    buf++;
    write(portfd, &buf, 1);
    write(portfd, "\r\n", 2);
    usleep(200000);

 }
 return 0;
}

现在当我尝试将数据从应用程序发送到蓝牙模块时出现问题,有时程序停止并说“随机非阻塞池已初始化&#34;或者它被卡在i = read(portfd, buf, 20);下面的代码中

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include <pthread.h> /* for threads */
#include <termios.h> /* uart */
#include <fcntl.h> /* uart */
#include <unistd.h> /* uart */
#define MODEMDEVICE "/dev/ttyPS1"
int main()
{
 printf("Opening %s\n", MODEMDEVICE);
 int portfd = open(MODEMDEVICE, O_RDWR | O_NOCTTY);
 if (portfd < 0) {
 printf("ERROR coultn't open %s\n", MODEMDEVICE);
 return -1;
 }

    printf("hello1\n\r");
 /* set terminal settings */
 struct termios tty;
 tcgetattr(portfd, &tty);

 cfsetospeed(&tty, (speed_t)B9600);
 cfsetispeed(&tty, (speed_t)B9600);
 tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8;
 tty.c_iflag = IGNBRK;
 tty.c_lflag = ICANON;
 tty.c_oflag = 0;
 tty.c_cflag |= CLOCAL | CREAD;
 tty.c_cc[VTIME] = 0;
 tty.c_cc[VMIN] = 1;
 tty.c_iflag &= ~(IXON | IXOFF | IXANY);
 tty.c_cflag &= ~(PARENB | PARODD);
 tty.c_cflag |= PARENB;
 tty.c_cflag &= ~CSTOPB;
 tcsetattr(portfd, TCSANOW, &tty);
 /* sleep a bit */
    printf("hello2\n\r");
 usleep(200000);
 /* flush possible characters in the input buffer */
 tcflush(portfd, TCIOFLUSH);
 char buf[20];
        printf("hello3\n\r");
 int i;

 while(1) {
    i = read(portfd, buf, 20); 
        printf("hello\n\r");

    buf[i] = 0;
    printf("%s", buf);
    printf("\n\r");

 }
 return 0;
}

有任何建议我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我找到了解决方案,这个post指出了第一个错误。 我应该设置时间等待字符读取大于0和最小字符数读取为零

 tty.c_cc[VTIME] = 5;
 tty.c_cc[VMIN] = 0;

我需要将tty.c_lflag标志设置为0以启用原始输入而不是规范,现在代码不断读取数据