无法读取串行数据,除非第三方程序打开端口
Can't read serial data unless port is opened by third party program
我正试图通过串行从Xbee读取数据。如果我通过调用xbee_init()初始化端口,那么我调用xbee_read()出于某种原因,我总是读取不数据并得到-1错误。然而,当我使用一些第三方程序,如gtkterm或Arduino串行监视器来查看端口时,我突然开始从我的程序中读取数据。然后它将正常工作,直到我结束我的程序并重新启动它,然后它又回到不读取数据。
有人知道为什么会发生这种情况吗?我已经在Xbee和Arduino上测试过了,结果是一样的。我从一个更大的c++程序中调用这些函数。谢谢!
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <termios.h>
#include "../include/m545_wireless_communication/readXbee.h"
int xbee_init (char *port, struct termios *tty) {
int fd=open(port,O_RDWR | O_NOCTTY | O_NONBLOCK);
if(fd == -1){return 0;}
else {
if(tcgetattr(fd, tty)!=0){return 0;}
else{
cfsetospeed(tty, B57600);
cfsetispeed(tty, B57600);
tty->c_cflag &= ~PARENB;
tty->c_cflag &= ~CSTOPB;
tty->c_cflag &= ~CSIZE;
tty->c_cflag |= CS8;
tty->c_cflag &= ~CRTSCTS;
tty->c_cflag |= CLOCAL | CREAD;
tty->c_iflag |= IGNPAR | IGNCR;
tty->c_iflag &= ~(IXON | IXOFF | IXANY);
tty->c_lflag |= ICANON;
tty->c_oflag &= ~OPOST;
tcsetattr(fd, TCSANOW, tty);
}
}
return fd;
}
char* xbee_read (int fd, char *buffer) {
if(fd){
int n=read(fd,buffer,11);
printf("%dn", n);
return buffer;
}else{
return NULL;
}
}
void xbee_close(int fd){
close(fd);
}
这是调用xbee函数的主函数。这是ROS项目的一部分,该节点旨在通过串行方式简单地从xbee读取数据,并以10Hz的速度将其发布到/xbee主题。
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>
#include <termios.h>
#include "m545_wireless_communication/readXbee.h"
int main(int argc, char **argv)
{
ros::init(argc, argv, "Broadcaster");
ros::NodeHandle broadcasterHandle;
ros::Publisher broadPub = broadcasterHandle.advertise<std_msgs::String>("xbee", 1);
char *port = "/dev/ttyUSB1";
struct termios tty;
char buffer[11];
int fd = xbee_init(port,&tty);
ros::Rate loop_rate(10);
while (ros::ok())
{
char *message = xbee_read(fd, buffer);
std_msgs::String msg;
std::stringstream ss;
ss << message;
msg.data = ss.str();
ROS_INFO("I heard: %s", msg.data.c_str());
broadPub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
}
ROS_INFO("Closing Port");
xbee_close(fd);
return 0;
}
我能够弄清楚问题是我如何声明c_cflags。Xbee需要在原始模式下读取,所以我只是使用cfmakeraw()而不是自己设置标志。然而,我仍然不确定我到底做错了什么,或者如何用第三方程序打开端口帮助连接。
int xbee_init (char *port, struct termios *tty) {
int fd=open(port,O_RDWR | O_NOCTTY | O_NONBLOCK);
if(fd == -1){return 0;}//should be something better
else {
if(tcgetattr(fd, tty)!=0){return 0;}
else{
// cfsetospeed(tty, B57600);
// cfsetispeed(tty, B57600);
// tty->c_cflag &= ~PARENB;
// tty->c_cflag &= ~CSTOPB;
// tty->c_cflag &= ~CSIZE;
// tty->c_cflag |= CS8;
// tty->c_cflag &= ~CRTSCTS;
// tty->c_cflag |= CLOCAL | CREAD;
// // tty->c_cflag |= PARENB;
// // tty->c_cflag ^= PARENB;
// tty->c_iflag |= IGNPAR | IGNCR;
// tty->c_iflag &= ~(IXON | IXOFF | IXANY);
// tty->c_lflag |= ICANON;
// tty->c_oflag &= ~OPOST;
cfmakeraw(&tty);
cfsetispeed(&tty, B57600);
tcsetattr(fd, TCSANOW, &tty);
}
}
return fd;
}
相关文章:
- 从Qt应用程序读取元数据
- 程序读取文字或解释变量所需的时间是否更少
- Qt程序读取文本只看到多行文件中的一行
- 从文件 C++ 程序读取停止工作
- C++程序读取ppm和pgm文件,对其进行操作并输出.编译错误
- 我如何让这个程序读取这个人键入的字符串,看看字符串是否相等
- 控制台程序读取文本文件行,做Levenstein并输出一个文本文件
- 使用tserial.cpp驱动程序读取COM端口时的延迟
- 序列化/封送C#中的简单对象以通过网络发送,供非托管C++应用程序读取
- 如何让 c + + 程序读取用户命名的文本文件
- 在 Windows 7 上使用C++程序读取 Windows 注册表
- 从另一个应用程序读取状态栏
- 内核驱动程序读取内存未发送整个字符串
- 如何使C++程序读取使用 Python subprocess.call() 传入的参数
- C++:无法使用其他程序读取程序的特定内存地址内的值
- 使用处理程序读取c#中的c++窗口
- 让gprof从Qt调试应用程序读取gmon.out输出时出现问题
- 如何让我的程序读取错误
- 我的c++程序读取一个矩阵并打印出非零的数字,这产生了一个运行时错误
- 如何让程序读取一行?c++