小编Pfe*_*fer的帖子

C++串口问题

问题:我有一个手持设备可以扫描所有包装上的图形颜色条形码.我可以使用跟踪设备自动滑动设备.该跟踪设备通过串行端口获取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++还不够了解是否有可以下载库的网站? …

c++ unix filemaker serial-port

2
推荐指数
1
解决办法
2702
查看次数

C++ const void*转换

我正在尝试将三个参数传递给我的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)

c++ file-io

0
推荐指数
1
解决办法
4357
查看次数

标签 统计

c++ ×2

file-io ×1

filemaker ×1

serial-port ×1

unix ×1