我使用安装了Advanced Tomato的华硕路由器(基于ARMv7 proc)作为我的ARMv7开发平台。我安装了编译器(gcc - 5.4.0-1)以及依赖项和OpenWRT Linux repo中的libFTDI (libftdi1 - 1.3-1)。
我在Linux x86_64平台上,使用从芯片制造商producer那里获得的ftd2xx库编写了一个程序。它工作正常。但现在我想使用开源libFTDI库将其移植到ARMv7平台上。
我使用基于ft245芯片的电路板。引脚编号0到3作为继电器输出,引脚4-7作为光隔离输入。我的目标是,运行参数为0到15的程序(名为arco)打开/关闭相应的继电器。此外,在这样的运行之后,程序返回十六进制所有引脚的实际状态。运行没有参数的程序,简单地返回所有8个引脚的状态作为十六进制数。我的问题是,当我使用例如arco 7这样的语法运行程序时,它会打开编号为0到2的中继,并关闭编号为3的中继,所以它是正确的。但是ftdi_read_data返回的不是引脚的实际状态,而是之前的状态。当我第二次运行arco (不带参数)时,它返回正确的值。
我做错了什么?
下面是这个小程序的源代码:
#include <stdio.h>
#include<stdlib.h>
#include <ftdi.h>
int main(int argc, char *argv[])
{
unsigned char c = 0;
unsigned char pkod = 0;
int parametr = 0;
int stat = 0;
int read = 0;
int wyn = 0;
struct ftdi_context ftdic;
if(argc > 1) { sscanf(argv[1], "%d", ¶metr); }
else { read = 1; }
if (parametr > 15 || parametr < 0) {
fprintf (stderr,"Bad call parameter\n");
exit(1); }
/* Initialize context for subsequent function calls */
ftdi_init(&ftdic);
/* Open FTDI device based on FT245R vendor & product IDs */
if(ftdi_usb_open(&ftdic, 0x5555, 0x0001) < 0) {
fprintf(stderr,"ARCO not avaliable\n");
exit(2);
}
/* Enable bitbang mode with a single output line */
ftdi_set_bitmode(&ftdic, 0x0f, BITMODE_BITBANG);
if(read != 1) {
pkod=(unsigned char)parametr;
ftdi_write_data(&ftdic, &pkod, 1);}
wyn=ftdi_read_data(&ftdic, &c, 1);
printf ("%x - %d\n",c,wyn);
exit(stat);
}更新1-上述程序中的小更改
运行两次程序的输出:
root@asus:/opt/static# ./arco 7; arco
f0 - 1
f7 - 1发布于 2021-08-28 17:42:34
我相信你想要的是ftdi_read_pins()。在bitbang模式下,会定期对引脚进行采样,并将值保存在FIFO中以供稍后读取。如果你想检查引脚的当前状态,你必须绕过这个过程,这就是“读取引脚”调用所做的事情。
https://stackoverflow.com/questions/39844758
复制相似问题