- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想读取由 GPS XBee 协议(protocol)发送的数据帧。 USB XStick 接收以下数据:
CHARS : 15931 SENTENCES = 0 CHECKSUM : 58
Heading : 55 Tilt: -46 Roll:2
CHARS : ....
等等...我可以通过在终端控件中输入来阅读:
$ screen /dev/ttyUSB0
我希望以相同的方式查看这些详细信息,但使用的是用 C 编写的程序。这是我所做的:
#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
#include <sys/fcntl.h>
#include <unistd.h>
#include "serial_port.h"
void read_Serial_Port(const char* DEVICE_PORT)
{
int file;
struct termios options;
char message[100];
unsigned int nCountMax = 60;
bool b;
file = open(DEVICE_PORT, O_RDONLY | O_NOCTTY | O_NDELAY);
if(file == -1){perror("Unable to open the serial port\n");}
printf("Serial port open successful\n");
tcgetattr(file, &options);
cfsetispeed(&options, B9600);
cfsetospeed(&options, B9600);
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag |= PARENB; //No parity
options.c_cflag |= PARODD;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8; //8 bits
options.c_iflag |= (INPCK | ISTRIP);
tcsetattr(file, TCSANOW, &options);
fcntl(file, F_SETFL, FNDELAY);
printf("Reading serial port ...\n\n");
b = readMessage(file, message, nCountMax);
if (b == 0){printf("Error while reading serial port\n");}
else printf("Serial port read successful\n");
close(file);
printf("Serial port closed\n");
};
bool readMessage(int file, char *message, unsigned int nCountMax)
{
int nbCharToRead;
char data[100];
int i;
if (file != 0)
{
i = 0;
while (i<nCountMax && data != ".")
{
if (read(file,&data,1) == -1)
{
printf("reception error\n");
return false;
}
else
{
message[i] = *data;
printf("%c", message[i]);
i++;
}
}
message[i] = 0;
return true;
}
}
但它不起作用,我收到“接收错误”,对应于:
read(file,&data,1) == -1
我哪里错了?
我的程序如下:
bool readMessage(int file, unsigned int nCountMax)
{
int i;
size_t nbytes;
ssize_t bytes_read;
if (file != -1)
{
i = 0;
char message[100];
char data[100];
while (i<nCountMax && data != ".")
{
if (read(file, data, 1) == -1)
{
printf("reception error\n");
printf("code errno = %d\n", errno);
return false;
}
else
{
nbytes = sizeof(data);
bytes_read = read(file, data, nbytes);
message[i] = *data;
printf("%c", message[i]);
i++;
}
}
message[i] = 0;
return true;
}
}
这次没有错误了,但是显示的字符是错误的:
$$$$QUC
U$C
$$$$JQMJ' J$Cz(HSQ'Q'y
UKUNiQUMJ
美元符号 $$$$ 代表四个一组的数字...我重复一遍,我想要的是
CHARS : 15931 SENTENCES = 0 CHECKSUM : 58
Heading : 55 Tilt: -46 Roll:2
CHARS : .....
我试过在格式字符串中使用 %c、%d、%x,但显然它们都不能正常工作......
谢谢!
最佳答案
在我的代码中,我只改变了c_cflag
,如下:
// Enable the receiver and set local mode...
options.c_cflag |= (CLOCAL | CREAD);
// Set 8-bit mode
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
我明天会发布更多代码,但请试一试(不要修改 c_iflag
)。
关于c - LINUX上用c程序读取/dev/ttyUSB0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13474923/
我有 2 个 USB 设备连接到树莓派, CP2108 USB 转串口转换器,有 4 个端口,当我连接到 usb 时,我得到 4 个 ttyUSBx EC25 GSM 调制解调器,同样适用于此情况。当
我有两个 usb-> 串行适配器,都是 ftdi,我们将它们命名为 ftdiA 和 ftdiB。该设备(在本例中为 raspberry pi,但它有点无关紧要)有 2 个 USB 端口,我们将它们命名
我在 Linux 的守护进程中使用端口时遇到问题。我使用 fcntl.h 中的 open 就像 serHandle_ = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY)
我一直在 cubieboard 上使用 3G 适配器来连接互联网。我已经安装了 usb_modeswitch ,它基本上将加密狗从 USB 存储模式切换到 USB 调制解调器模式。我验证了启动后切换会
我刚开始使用我的 Raspberry Pi,我有一个项目,我想从 USB 端口读取数据。我安装了Java JDK8并编写了编译运行的程序。但是我收到/dev/ttyUSB1 不存在的消息。 我只有一根
我有一个程序,当计算机运行时,该程序将始终运行。它通过 USB 设备与串行接口(interface)连接。有时,当计算机打开时,该设备可能不存在。 我的问题是确认设备文件何时存在的好方法。我可以创建一
我有一个 USB 到 RS485 转换器连接到我的 linux 盒子: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port 目前正在使用
我正在为一个项目使用 Go,并通过串行端口 (ttyusb) 将数据传输到嵌入式设备。在快速和“大”传输期间,我注意到传输的数据与我想要发送的值不匹配。 我尝试了各种可用的库,最后它们都使用系统调用进
我的程序需要访问ttyUSB没有root权限。 我尝试用 chmod 777 /dev/ttyUSB0 更改它如您所知,当我重新启动时,此权限更改为默认值。如何为此配置我的 udev rules.d?
以下日志来自 TeraTerm,一个用于 windows 的终端仿真器。我想通过以下方式从我的 Linux 中的 ttyUSB0 获取日志。 [Thu Apr 14 15:08:14.410 2016
我在 Raspbian 上运行一个自定义 C++ 程序,它会每隔一段时间重新启动它的 USB 端口。但是,我注意到/dev/USB* 枚举在电源循环之间不一致,需要能够处理这个问题。 是否有任何优雅的
我有 USB 产品的供应商和产品代码:0403:6001 我想知道如何轻松地将 lsusb 命令的结果与 /dev/ttyUSB* 上的设备确定联系起来 lsusb 给我 Bus 001 Device
AM 有一个 C 程序,它使用系统列出/dev/ttyUSB* 设备,我如何将它们存储在数组中并进行处理。 #include #include int main() { system("l
我有一个设备不断地将一些数据爆破到通过 USB 连接到我的 PC 的 FTDI 中。我想使用简单的 bash 脚本将数据记录到 CSV 文件中。 当我 cat/dev/ttyUSB0 时,我得到了一些
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 11 年前。 Improve thi
获取 Linux 系统上所有可用串行端口/设备列表的正确方法是什么? 也就是说,当我遍历/dev/中的所有设备时,如何以经典的方式判断哪些是串口,即那些通常支持波特率和RTS/CTS流量的设备控制?
想在 Advanced Tomato 固件下将 gsm 调制解调器(华为 E160G)连接到路由器 ASUS RT-N18U。但是不知道在dongle配置文件dongle.conf中指定了什么usb设
问题 我现在不得不使用一个相当尴尬的 API,坚持由我提供设备的地址,通过 USB 端口链接,格式为 通讯* .然而,在 Ubuntu 我正在使用并且必须使用的机器,如果我插入此设备,它将自动分配一个
我正在尝试访问已经运行的特权 docker 容器中的串行端口(作为用户),但我收到“权限被拒绝”错误,而权限应该正确设置。作为最小的可重现示例(假设串行设备连接到/dev/ttyUSB0): # st
我是一名优秀的程序员,十分优秀!