我在Linux中编码以控制我的板上的gpio端口,使用以下代码。然而,read()的结果总是0x10,这是LF换行的十六进制。电压是一个枚举变量,其整型值为0和1,分别代表低和高。Fd是gpio端口的文件描述符。0x30是字符'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;
}
为了与shell实用程序兼容,GPIO端口的内容通常是后跟换行符的单个字符——例如:
% xxd /sys/class/gpio/gpio89/value
0000000: 310a 1.
向GPIO设备写入单个字符会将文件指针推进到第二个字符,这个字符通常是你看到的换行符。
在进行读/写操作之前,需要将文件指针重置到起点:
lseek(fd, 0, SEEK_SET);