This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

beaglebone black 读写uart

#include <sys/types.h>

#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#define BAUDRATE B115200
#define UART_DEVICE "/dev/ttyS0" //change to ttys0,originally it is ttys3

#define FALSE -1
#define TRUE 0
////////////////////////////////////////////////////////////////////////////////
/**
*@brief 设置串口通信速率
*@param fd 类型 int 打开串口的文件句柄
*@param speed 类型 int 串口速度
*@return void
*/
int speed_arr[] = {B115200, B38400, B19200, B9600, B4800, B2400, B1200, B300,
B115200, B38400, B19200, B9600, B4800, B2400, B1200, B300, };
int name_arr[] = {115200, 38400, 19200, 9600, 4800, 2400, 1200, 300,
115200, 38400, 19200, 9600, 4800, 2400, 1200, 300, };
void set_speed(int fd, int speed){
int i;
int status;
struct termios Opt;
tcgetattr(fd, &Opt);
for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++) {
if (speed == name_arr[i]) {
tcflush(fd, TCIOFLUSH);
cfsetispeed(&Opt, speed_arr[i]);
cfsetospeed(&Opt, speed_arr[i]);
status = tcsetattr(fd, TCSANOW, &Opt);
if (status != 0) {
perror("tcsetattr fd1");
return;
}
tcflush(fd,TCIOFLUSH);
}
}
}
////////////////////////////////////////////////////////////////////////////////
/**
*@brief 设置串口数据位,停止位和效验位
*@param fd 类型 int 打开的串口文件句柄
*@param databits 类型 int 数据位 取值 为 7 或者8
*@param stopbits 类型 int 停止位 取值为 1 或者2
*@param parity 类型 int 效验类型 取值为N,E,O,,S
*/
int set_Parity(int fd,int databits,int stopbits,int parity)
{
struct termios options;
if ( tcgetattr( fd,&options) != 0) {
perror("SetupSerial 1");
return(FALSE);
}
options.c_cflag &= ~CSIZE;
switch (databits) /*设置数据位数*/
{
case 7:
options.c_cflag |= CS7;
break;
case 8:
options.c_cflag |= CS8;
break;
default:
fprintf(stderr,"Unsupported data size\n"); return (FALSE);
}
switch (parity)
{
case 'n':
case 'N':
options.c_cflag &= ~PARENB; /* Clear parity enable */
options.c_iflag &= ~INPCK; /* Enable parity checking */
break;
case 'o':
case 'O':
options.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/
options.c_iflag |= INPCK; /* Disnable parity checking */
break;
case 'e':
case 'E':
options.c_cflag |= PARENB; /* Enable parity */
options.c_cflag &= ~PARODD; /* 转换为偶效验*/
options.c_iflag |= INPCK; /* Disnable parity checking */
break;
case 'S':
case 's': /*as no parity*/
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;break;
default:
fprintf(stderr,"Unsupported parity\n");
return (FALSE);
}
/* 设置停止位*/
switch (stopbits)
{
case 1:
options.c_cflag &= ~CSTOPB;
break;
case 2:
options.c_cflag |= CSTOPB;
break;
default:
fprintf(stderr,"Unsupported stop bits\n");
return (FALSE);
}
/* Set input parity option */
if (parity != 'n')
options.c_iflag |= INPCK;
tcflush(fd,TCIFLUSH);
options.c_cc[VTIME] = 150; /* 设置超时15 seconds*/
options.c_cc[VMIN] = 0; /* Update the options and do it NOW */
if (tcsetattr(fd,TCSANOW,&options) != 0)
{
perror("SetupSerial 1");
return (FALSE);
}
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); /*Input*/
options.c_oflag &= ~OPOST; /*Output*/
return (TRUE);
}
////////////////////////////////////////////////////////////////////////////////
int main(int argc, char *argv[])
{

int fd, c=0, res;

char buf[256];

printf("Start...\n");
fd = open(UART_DEVICE, O_RDWR);

if (fd < 0) {
perror(UART_DEVICE);
exit(1);
}

printf("Open...\n");
set_speed(fd,115200);
if (set_Parity(fd,8,1,'N') == FALSE) {
printf("Set Parity Error\n");
exit (0);
}

printf("Reading...\n");
while(1) {
res = read(fd, buf, 255);

if(res==0)
continue;
buf[res]=0;

printf("%s", buf);

if (buf[0] == 0x0d)
printf("\n");

if (buf[0] == '@') break;
}

printf("Close...\n");
close(fd);

return 0;
}

用地上面的网上找的代码,编译运行后报错:

tcsetattr fd1:Input/Output error

SetupSerial1:Input/Output error

Set Parity Error

我的板子是编译的ti-sdk-am335x-evm-07.00.00.00

  • 试试下面的代码

    #include <stdio.h> /*标准输入输出定义*/
    #include <stdlib.h> /*标准函数库定义*/
    #include <unistd.h> /*Unix标准函数定义*/
    #include <sys/types.h> /**/
    #include <sys/stat.h> /**/
    #include <fcntl.h> /*文件控制定义*/
    #include <termios.h> /*PPSIX终端控制定义*/
    #include <errno.h> /*错误号定义*/
    #include <sys/time.h>

    /***@brief 设置串口通信速率
    *@param fd 类型 int 打开串口的文件句柄
    *@param speed 类型 int 串口速度
    *@return void*/
    #define TRUE 1
    #define FALSE -1

    int speed_arr[] = {B115200, B38400, B19200, B9600, B4800, B2400, B1200, B300,
    B38400, B19200, B9600, B4800, B2400, B1200, B300, };
    int name_arr[] = {115200, 38400, 19200, 9600, 4800, 2400, 1200, 300,
    38400, 19200, 9600, 4800, 2400, 1200, 300, };
    void set_speed(int fd, int speed)
    {
    int i;
    int status;
    struct termios Opt;
    tcgetattr(fd, &Opt);

    for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++)
    {
    if (speed == name_arr[i])
    {
    tcflush(fd, TCIOFLUSH);
    /* 设置串口的波特率 */
    cfsetispeed(&Opt, speed_arr[i]);
    cfsetospeed(&Opt, speed_arr[i]);
    status = tcsetattr(fd, TCSANOW, &Opt);
    if (status != 0)
    perror("tcsetattr fd1");
    return;
    }
    tcflush(fd,TCIOFLUSH);
    }

    }
    /**
    *@brief 设置串口数据位,停止位和效验位
    *@param fd 类型 int 打开的串口文件句柄*
    *@param databits 类型 int 数据位 取值 为 7 或者8*
    *@param stopbits 类型 int 停止位 取值为 1 或者2*
    *@param parity 类型 int 效验类型 取值为N,E,O,,S
    */
    int set_Parity(int fd,int databits,int stopbits,int parity)
    {
    struct termios options;
    if ( tcgetattr( fd,&options) != 0)
    {
    perror("SetupSerial 1");
    return(FALSE);
    }
    options.c_cflag &= ~CSIZE;
    switch (databits) /*设置数据位数*/
    {
    case 7:
    options.c_cflag |= CS7;
    break;
    case 8:
    options.c_cflag |= CS8;
    break;
    default:
    fprintf(stderr,"Unsupported data size\n");
    return (FALSE);
    }
    switch (parity)
    {
    case 'n':
    case 'N':
    options.c_cflag &= ~PARENB; /* Clear parity enable */
    options.c_iflag &= ~INPCK; /* Enable parity checking */
    options.c_iflag &= ~(ICRNL|IGNCR);
    options.c_lflag &= ~(ICANON );
    break;
    case 'o':
    case 'O':
    options.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/
    options.c_iflag |= INPCK; /* Disnable parity checking */
    break;
    case 'e':
    case 'E':
    options.c_cflag |= PARENB; /* Enable parity */
    options.c_cflag &= ~PARODD; /* 转换为偶效验*/
    options.c_iflag |= INPCK; /* Disnable parity checking */
    break;
    case 'S':
    case 's': /*as no parity*/
    options.c_cflag &= ~PARENB;
    options.c_cflag &= ~CSTOPB;
    break;
    default:
    fprintf(stderr,"Unsupported parity\n");
    return (FALSE);
    }
    /* 设置停止位*/
    switch (stopbits)
    {
    case 1:
    options.c_cflag &= ~CSTOPB;
    break;
    case 2:
    options.c_cflag |= CSTOPB;
    break;
    default:
    fprintf(stderr,"Unsupported stop bits\n");
    return (FALSE);
    }
    /* Set input parity option */
    if (parity != 'n')
    options.c_iflag |= INPCK;
    options.c_cc[VTIME] = 150; // 15 seconds
    options.c_cc[VMIN] = 0;

    tcflush(fd,TCIFLUSH); /* Update the options and do it NOW */
    if (tcsetattr(fd,TCSANOW,&options) != 0)
    {
    perror("SetupSerial 3");
    return (FALSE);
    }
    return (TRUE);
    }
    /**
    *@breif 打开串口
    */
    int OpenDev(char *Dev)
    {
    int fd = open( Dev, O_RDWR ); //| O_NOCTTY | O_NDELAY
    if (-1 == fd)
    { /*设置数据位数*/
    perror("Can't Open Serial Port");
    return -1;
    }
    else
    return fd;

    }
    /**
    *@breif main()
    */
    int main(int argc, char **argv)
    {
    int fd;
    int nread;
    char buffer[512];
    //char *dev ="/dev/ttySAC1";
    int n=0,i=0;
    const char* dev = NULL;
    dev = argv[1];
    if(dev==NULL)
    {
    printf("Please input seria device name ,for exmaple /dev/ttyO1.\nNote:This is loop test application. Make sure that your serial is loop\n");
    return 0;
    }
    /* 打开串口 */
    fd = OpenDev(dev);
    if (fd>0)
    set_speed(fd,115200); //设置波特率
    else
    {
    printf("Can't Open Serial Port!\n");
    exit(0);
    }
    if (set_Parity(fd,8,1,'N')== FALSE) //设置传递参数
    {
    printf("Set Parity Error\n");
    exit(1);
    }

    printf("\nWelcome to TTYtest\n\n");

    memset(buffer,0,sizeof(buffer));

    char test[100]="forlinx am335x uart test......";
    write(fd, test, strlen(test));
    printf("Send test data------%s\n",test);


    while(1)
    {
    nread = read(fd,&buffer[n],1);
    printf("read char is %c \n",buffer[n]);

    if (strlen(buffer)==strlen(test))
    {

    printf("Read Test Data finished,Read Test Data is-------%s\n",buffer);
    memset(buffer,0,sizeof(buffer));

    printf("Send test data again------%s\n",test);
    write(fd, test, strlen(test));
    n=0;
    sleep(1);
    continue;

    }

    n++;
    }
    }


  • ^_^ 能顺便把编译的命令也告诉我下么,我是新手,可能我编译的方式不对。。。。。。敲完命令总有warning,谢谢啦~

  • 我看你用的是UART0,有没有换个串口试试,UART0是调试串口

  • 恩恩  我去试试

  • ^_^  hi~ tty1应该是可以的,但是换到ttyS1~ttyS3,还是

    tcsetattr fd1:Input/Output error

    SetupSerial 1:Input/Output error

    Set Parity Error

  • 是不是其它UART的pin脚被占用了

  • 没有被占用。在/dev里ttyO0 好像是uart0的设备节点,但是除了ttyO0就没有别的了,哪个是uart1的呢?我怎么访问uart1?谢谢啦

  • yiwei zhang 说:

    ^_^  hi~ tty1应该��可以的,但是换到ttyS1~ttyS3,还是

    tcsetattr fd1:Input/Output error

    SetupSerial 1:Input/Output error

    Set Parity Error

    你首先看看uart 对应的device file ttys 能不能被正常open

x 出现错误。请重试或与管理员联系。