我有一个连接到/dev/ttyUSB0
的USB到串行适配器,它连接到一个旋转阶段。我只需通过串口发送ASCII命令即可与该旋转阶段进行通信。即只是要求该轮换阶段的当前位置:
echo -e "1tp\r" > /dev/ttyUSB
cat /dev/ttyUSB
返回当前位置:“1TP-0.00000”现在我希望能够在C程序中的某个触发器上完成此操作。
我浏览了这个惊人的档案,并找到了一些如何完成它的例子。例如
基于这些,我写了这个非常丑陋的代码,只是尝试将“1tp \ r”写入串口然后再读取返回值(旋转阶段位置)。这是下面的代码。
#include <stdio.h>
#include <sys/types.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
int main(int argc, char *argv[])
{
char line[1024];
int chkin;
int chkout;
char input[1024];
char msg[1024];
char serport[24];
// argv[1] - serial port
sprintf(serport, "%s", argv[1]);
int file= open(serport, O_RDWR | O_NOCTTY | O_NDELAY);
printf("file descriptor: %d\n",file);
if (file == 0)
{
sprintf(msg, "open_port: Unable to open %s.\n", serport);
perror(msg);
}
else
fcntl(file, F_SETFL, FNDELAY); //fcntl(file, F_SETFL, 0);
while (1)
{
usleep (1000000);
// printf("enter input data:\n");
//scanf("%s",&input[0]);
// printf("You entered %s\n",&input);
//input= "1tp\r";
chkin = write(file,"1tp\r",5);
printf("chkin: %d\n",chkin);
if (chkin<0)
{
printf("cannot write to port\n");
}
fcntl(file, F_SETFL, FNDELAY);
//chkin=read(file,line,sizeof line);
usleep (100000);
//while ((chkin=read(file,line,sizeof line))>=0)
//printf("chkin: %d\n",chkin);
chkout = read(file, line ,sizeof line);
//{
if (chkout<0)
{
printf("cannot read from port\n");
}
else
{
printf("bytes: %d, line=%s\n",chkout, line);
}
//}
/*CODE TO EXIT THE LOOP GOES HERE*/
if (input[0] == 'q') break;
}
close(file);
return 0;
}
嗯,它不起作用。当我将其运行为:./sertest /dev/ttyUSB0
时,我只收到错误"cannot read from port"
。实际上,问题似乎是"1tp\r"
字符串似乎没有写入串口。此外,一旦完成此操作,串口设置似乎全部搞砸了,因为我无法通过简单的终端命令与舞台进行通信,需要使用minicom重置串口。
我还应该注意,我知道我可以通过该代码的第二部分从串口读取一些东西,因为我已设法使用终端命令发送"1tp\r"
字符串并只读取输出在下面的例子中使用相关的代码片段。
所以,我会很感激如何成功地将这个简单的字符串"1tp\r"
(或类似的字符串)写入串口,并替代读取串口。
我不是程序员,所以我提前为这段代码的糟糕风格道歉。