我在Linux中编码以使用以下代码控制我板上的gpio端口。但是,read()的结果始终为0x10,这是LF换行的十六进制。 电压是一个枚举变量,其int值为0,1代表低电平和高电平。 fd是gpio端口的文件描述符。 0x30是char'0'的十六进制代码。 write()中没有错误。
int set_gpio( int fd,enum voltage_e voltage)
{
const unsigned char w_buff =0x30+voltage;
unsigned char r_buff='2';
if (0 >= write(fd, &w_buff, 1))
{
LOGD(" Error1 in setting gpio to %d", voltage);
return -1;
}
__usr_sleep(0, 10000000);
if (read(fd, &r_buff, 1))
{
if (r_buff != 0x30+voltage)
{
LOGD(" r_buff is %d", r_buff);
return -1;
}
}
else
{
LOGD(" Error3 in setting gpio to %d", voltage);
return -1;
}
return 0;
}
答案 0 :(得分:1)
为了与shell实用程序兼容,GPIO端口的内容通常是单个字符,后跟换行符 - 例如:
% xxd /sys/class/gpio/gpio89/value
0000000: 310a 1.
将单个字符写入GPIO设备是将文件指针前进到第二个字符,这个字符始终是您所看到的换行符。
在执行读/写操作之前,您需要将文件指针重置为开头:
lseek(fd, 0, SEEK_SET);