[问题] uart read 读不到东西

楼主: hirofumisyo (Ami)   2018-10-26 03:23:28
各位大大好,
我在使用redpitaya (ubuntu 系统)的uart功能对仪器读取资料时发现读不到东西,
使用的code是官方提供的C code(连结:http://0rz.tw/2JOfH ),
我把目前卡住的贴上来:
int main(int argc, char *argv[]){
char *data = "HELLO WOLRD!";
/* uart init */
if(uart_init() < 0){
printf("Uart init error.\n");
return -1;
}
/* Sample write */
if(uart_write(data) < 0){
printf("Uart write error\n");
return -1;
}
/* Sample read */
if(uart_read(strlen(data)) < 0){
printf("Uart read error\n");
return -1;
}
/* CLOSING UART */
release();
return 0;
}
目前程式是卡在uart_read里面,
程式在执行时会一直print AGAIN!,
好像一直没有接收到讯号的样子。
uart_read 部分如下:
static int uart_read(int size){
/* Read some sample data from RX UART */
/* Don't block serial read */
fcntl(uart_fd, F_SETFL, FNDELAY);
while(1){
if(uart_fd == -1){
fprintf(stderr, "Failed to read from UART.\n");
return -1;
}
unsigned char rx_buffer[size];
int rx_length = read(uart_fd, (void*)rx_buffer, size);
if (rx_length < 0){
/* No data yet avaliable, check again */
if(errno == EAGAIN){
fprintf(stderr, "AGAIN!\n");
continue;
/* Error differs */
}else{
fprintf(stderr, "Error!\n");
return -1;
}
}else if (rx_length == 0){
fprintf(stderr, "No data waiting\n");
/* Print data and exit while loop */
}else{
rx_buffer[rx_length] = '\0';
printf("%i bytes read : %s\n", rx_length, rx_buffer);
break;
}
}
return 0;
}
不过若我把Tx跟Rx接在一起,
则可以顺利接收到我输出指令的回传。
下面是我把Tx(黄色)跟Rx(绿色)的讯号用示波器截图:
https://imgur.com/a/bGchYzx
可以看到Rx慢了Tx 25ms左右,
而当我把Tx跟Rx连在一起时讯号是一起起来的,
不知道为何有delay就读不到东西,
uart_read的while循环不就是在等待吗?
我在网络上有看到blocking or non blocking设定的问题,
我不知道会不会是这个原因造成的,
目前我的设定是:
uart_fd = open("/dev/ttyPS1", O_RDWR | O_NOCTTY | O_NDELAY);
settings.c_cflag &= ~PARENB; /* no parity */
settings.c_cflag &= CSTOPB; /* 1 stop bit */
settings.c_cflag &= ~CSIZE;
// settings.c_cflag &= ~ICRNL;
settings.c_cflag |= CS8 | CLOCAL; /* 8 bits */
settings.c_lflag = ICANON; /* canonical mode */
settings.c_oflag &= ~OPOST; /* raw output */
有人可以帮我吗?
感激不尽
作者: uorol (′‧ω‧‵)   2018-10-26 20:47:00
BaudRate之类的设定有检查嘛是说你有示波器, 把接版子跟仪器接起来RX有量得到吗

Links booklink

Contact Us: admin [ a t ] ucptt.com