linux 串口读不出来,串口编程可写入不能读取 怎么解决

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

#define DEV_NAME "/dev/ttySP1"

#define EXPORT_PATH "/sys/class/gpio/export" //GPIO 设备导出设备

#define GPIO "77" //76:GPIO2.12 77:GPIO2.13 78:GPIO2.14

#define DEV_PATH "/sys/class/gpio/gpio77/value" //输入输出电平值设备

#define DIRECT_PATH "/sys/class/gpio/gpio77/direction" //GPIO 输入输出控制设备

int main(void)

{

int fd_export, fd_dev, fd_dir;

int ret;

char value;

int iFd, i;

int len;

int fd;

unsigned char SenducBuf[8]={0x02,0x03,0x00,0x56,0x00,0x01,0x64,0x29};

unsigned char RecucBuf[15]={0};

struct termios opt;

iFd = open(DEV_NAME, O_RDWR | O_CREAT| O_SYNC);

if (iFd < 0) {

perror(DEV_NAME);

return -1;

}

tcgetattr(iFd, &opt);

cfsetispeed(&opt, B9600);

cfsetospeed(&opt, B9600);

if (tcgetattr(iFd, &opt) < 0) {

return -1;

}

opt.c_lflag &= ~(ECHO | ICANON | ECHOE | ISIG);

opt.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);

opt.c_oflag &= ~(OPOST);

opt.c_cflag &= ~(CSIZE | PARENB);

//opt.c_cflag &= ~CSTOPB;

opt.c_cflag |= CS8;

opt.c_cc[VMIN] = 5;

opt.c_cc[VTIME] = 50;

if (tcsetattr(iFd, TCSANOW, &opt) < 0) {

return -1;

}

tcflush(iFd, TCIOFLUSH);

fd_export = open(EXPORT_PATH, O_WRONLY); //打开 GPIO 设备导出设备

if (fd_export < 0) {

perror(EXPORT_PATH);

}

ret = write(fd_export,GPIO,strlen(GPIO)); //向export文件写入GPIO排列序号字符串

fd_dir = open(DIRECT_PATH,O_RDWR); //打开 GPIO 输入输出控制设备

if (fd_dir < 0) {

perror(DIRECT_PATH);

}

ret = write(fd_dir, "in", sizeof("in")); //写入 GPIO 输入(out)方向

fd_dev = open(DEV_PATH, O_RDWR); //打开输入输出电平值设备

if (fd_dev < 0) {

perror(DEV_PATH);

}

while(1)

{

lseek(fd_dev, 0, SEEK_SET);

write(fd_dev, "1", sizeof("1")); //向 GPIO 写入电平值

write(iFd, SenducBuf, 8);

sleep(3);

lseek(fd_dev, 0, SEEK_SET);

write(fd_dev, "0", sizeof("0")); //向 GPIO 写入电平值

len = read(iFd, RecucBuf, 7);

printf("error is : %d\n",errno);

printf("get date: %d \n", len);

for (i = 0; i < len; i++) {

printf(" %x", RecucBuf[i]);

}

printf("\n");

}

close(iFd);

close(fd_dev);

close(fd_dir);

close(fd_export);

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux系统下串口编程指的是在Linux操作系统中使用程序来控制串口设备,通常可以用于与串口设备进行通信。 要在Linux系统中进行串口编程,需要使用特定的API(应用程序编程接口)。常用的API包括POSIX的termios库和Linux专有的serial API。 使用termios库的步骤如下: 1. 使用open函数打开串口设备文件,例如"/dev/ttyS0"。 2. 使用tcgetattr函数获取串口的属性。 3. 使用修改串口属性的函数(如cfsetispeed和cfsetospeed)设置串口的输入/输出波特率。 4. 使用tcsetattr函数将修改后的属性设置回串口。 5. 使用read和write函数进行串口的数据写。 6. 使用close函数关闭串口。 使用serial API的步骤如下: 1. 使用open函数打开串口设备文件,例如"/dev/ttyS0"。 2. 使用ioctl函数设置串口的属性,包括波特率、数据位、停止位和校验方式等。 3. 使用read和write函数进行串口的数据写。 4. 使用close函数关闭串口。 在编写串口程序时,还需要注意其他问题,如确保串口设备文件有足够的权限访问、处理串口通信中 ### 回答2: Linux串口编程是通过使用系统调用函数来实现的。在Linux系统中,串口设备可以被看作是一种特殊的文件,通过打开和操作该文件,我们可以进行串口通信操作。 在Linux中,常用的串口编程函数是open、close、read、write和ioctl等。我们首先需要使用open函数来打开串口设备文件,例如/dev/ttyS0。打开成功后,我们可以使用read函数从串口读取数据,使用write函数向串口写入数据,使用close函数关闭串口设备。 除了基本的写操作,我们还可以使用ioctl函数来设置和获取串口的属性。通过设置串口的波特率、数据位、校验位、停止位等参数,我们可以实现不同的串口通信需求。一般情况下,我们需要使用termios结构体来保存和配置串口属性,然后通过ioctl函数来设置。 另外,Linux下还提供了一种轮询和一种中断的方式来进行串口通信。轮询方式是通过不断地查询串口是否有数据到达,然后进行读取。中断方式是通过设置串口的中断响应函数,当有数据到达时,会触发中断并执行相应的处理函数。 总之,Linux串口编程是一种通过打开、写和ioctl等系统调用函数来操作串口设备文件的方法。通过设置串口属性,我们可以实现不同的串口通信需求。 ### 回答3: Linux下的串口编程是指在Linux操作系统下对串行端口(串口)进行数据输入输出的一种编程技术。串口编程通常用于连接外部设备与计算机之间进行数据交互。 在Linux下,串口设备被视作特殊的文件,通过打开和写这些特殊文件来对串口进行操作。常用的串口编程接口有标准C库的系统调用,如open()、read()、write()等,也可以使用Linux提供的串口库函数,如termios库函数。 串口编程的基本流程如下: 1. 打开串口设备文件,使用open()函数,得到串口文件描述符。 2. 配置串口参数,使用termios库函数,设置波特率、数据位、停止位、奇偶校验等参数。 3. 读取写入串口数据,使用read()或write()函数进行数据交互。 4. 关闭串口设备,使用close()函数关闭串口文件描述符。 在进行串口编程时,需要注意以下几点: - 波特率、数据位、停止位、奇偶校验等参数需要与外设保持一致。 - 需要使用合适的访问权限打开串口设备文件。 - 需要适当处理写时可能发生的错误和异常。 - 可以使用非阻塞模式进行写,以提高程序的响应性。 通过Linux下的串口编程,可以实现与各种外设的通信,如传感器、控制器、无线模块等。它被广泛应用于嵌入式系统、物联网设备、机器人等领域,具有较高的灵活性和扩展性。同时,针对不同需求,还可以使用一些开源的串口通信库,如pyserial、libserial等,简化串口编程的过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值