问题:我有一个手持设备可以扫描所有包装上的图形颜色条形码.我可以使用跟踪设备自动滑动设备.该跟踪设备通过串行端口获取ascii代码.我需要让这个东西在Mac上的FileMaker中运行.所以没有终端程序等......
到目前为止我得到了什么:我买了一个Keyspan USB /串口适配器.使用名为ZTerm的程序,我成功地向设备发送命令.示例:"C,7 ^ M ^ J"
我也可以使用这个命令在终端中执行相同的操作:screen /dev/tty.KeySerial1 57600然后输入上面的相同命令(但是当我输入时我只需按下Control-M和Control-J退货和换行)
现在我正在为FileMaker编写一个插件(当然是用C++编写的).我希望得到我在C++中所做的事情,所以当我在FileMaker中安装该插件时,我可以调用其中一个函数并让整个过程在那里进行.
我能够连接到设备,但我无法与它通信.它没有回应任何事情.
我尝试使用以下方法连接到设备(成功):
FILE *comport;
if ((comport = fopen("/dev/tty.KeySerial1", "w")) == NULL){...}
Run Code Online (Sandbox Code Playgroud)
和
int fd;
fd = open("/dev/tty.KeySerial1", O_RDWR | O_NOCTTY | O_NDELAY);
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止与设备交谈的方式:
fputs ("C,7^M^J",comport);
Run Code Online (Sandbox Code Playgroud)
要么
fprintf(comport,"C,7^M^J");
Run Code Online (Sandbox Code Playgroud)
要么
char buffer[] = { 'C' , ',' , '7' , '^' , 'M' , '^' , 'J' };
fwrite (buffer , 1 , sizeof(buffer) , comport );
Run Code Online (Sandbox Code Playgroud)
要么
fwrite('C,7^M^J', 1, 1, comport);
Run Code Online (Sandbox Code Playgroud)
问题:当我从终端连接到设备并使用ZTerm时,我能够将波特率设置为57600.我认为这可能就是为什么它在这里没有响应.但我不知道该怎么做......有谁知道怎么做?我试过这个,但它不起作用:
comport->BaudRate = 57600;
Run Code Online (Sandbox Code Playgroud)
有很多类解决方案,但他们都称这些包括termios.h和stdio.h等文件.我没有这些,无论出于何种原因,我找不到它们下载.我已经下载了一些例子,但是其中有20个文件,他们都在调用我找不到的其他文件(如上面列出的那些文件).我是否需要找到这些,如果是这样的话?我对C++还不够了解是否有可以下载库的网站? …
我正在尝试将三个参数传递给我的write()函数:
write(fd, "C,1,1\r\n", 7);
Run Code Online (Sandbox Code Playgroud)
这很好用.但是我想获取一个参数并将其传递给命令部分以使其动态化:
write(fd, N, 4);
Run Code Online (Sandbox Code Playgroud)
我不熟悉c ++类型,但它一直要求一种"const void*"我已经能够将我的变量N转换成几种不同的格式,希望可以更容易转换.这是我尝试过的:
const fmx::FixPt& outValue = dataVect.AtAsNumber(3);
const double N = outValue.AsLong();
double N = outValue.AsLong();
Run Code Online (Sandbox Code Playgroud)
所以double和const double(*可能几乎是一样的......我不太了解c ++)
我也可以这样做:
const fmx::FixPt& outValue = dataVect.AtAsNumber(3);
write(fd, outValue, 4);
Run Code Online (Sandbox Code Playgroud)
但是我觉得要问每个人如何转换一个double会比尝试解释或找出类似const fmx :: FixPt&...
*我也尝试过:
write(fd, &N, 4);
Run Code Online (Sandbox Code Playgroud)
只能摆脱我的错误,但仍然无法正常工作.
那么,甚至可以转换为"const void*"的类型吗?
非常感谢你!
这是代码:
const fmx::FixPt& outValue = dataVect.AtAsNumber(3);
double N = outValue.AsLong();
int fd;
struct termios options;
fd=open("/dev/tty.KeySerial1", O_RDWR | O_NOCTTY | O_NDELAY);
fcntl(fd, F_SETFL, 0);
tcgetattr(fd,&options);
options.c_ispeed=57600;
options.c_ospeed=57600;
options.c_cflag |= (CLOCAL | …Run Code Online (Sandbox Code Playgroud)