【发布时间】:2017-06-29 18:56:50
【问题描述】:
我写了一个类来处理从模块传到串口的数据。 目标是让端口始终监听并在需要时传输一些消息。 该模块使用十六进制令牌进行通信。 这是我的接收部分代码:
int serial::serial_receive (string &s_buffer, int &rcp)
{
struct pollfd fds[1];
fds[0].fd = ptr;
fds[0].events = POLLIN ;
int pollrc = poll( fds, 1, 1000);
if (pollrc < 0)
{
perror("poll");
}
else if( pollrc > 0)
{
if( fds[0].revents & POLLIN )
{
char buff[1024];
ssize_t rc = read(ptr, buff, sizeof(buff) );
if (rc > 0)
{
s_buffer = buff;
rcp = rc;
}
else {cout << "error reading fd";}
}
}
return pollrc;
}
在我的测试主目录中:
using namespace std;
char test[] = {0xAA,0x34,0x00,0x22};
int main(void) {
stringstream ss;
const char* mybuff;
string serial_buffer;
int rcl;
serial mymodule ("/dev/ttymxc5",115200, 0); //port configuration
ss << std::hex << setfill('0');
mymodule.serial_send(test,4); //send method
usleep(2000);
mymodule.serial_receive(serial_buffer,rcl); //receive method
mybuff = serial_buffer.c_str();
for (int i = 0; i < 8; ++i)
{
ss << std::setw(2) << static_cast<unsigned>(mybuff[i]);
}
cout << ss.str() << endl;
return 0;
}
我的串口配置是:
int serial::serial_set()
{
struct termios options;
if (tcgetattr (ptr, &options) != 0)
{
return EXIT_FAILURE;
}
cfsetospeed (&options, B115200);
cfsetispeed (&options, B115200);
options.c_cflag = (options.c_cflag & ~CSIZE) | CS8;
options.c_iflag &= ~IGNBRK;
options.c_lflag = 0;
options.c_oflag = 0;
options.c_cc[VMIN] = 0;
options.c_cc[VTIME] = 5;
options.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON);
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~(PARENB | PARODD);
options.c_cflag |= serial_parity;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CRTSCTS;
if (tcsetattr (ptr, TCSANOW, &options) != 0)
{
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
请注意,ISTRIP 位设置为 0,以免丢失第 8 位。
我得到的结果“几乎”正确。 我正在考虑 AA B4 04 01 00 00 00 94 序列,但我得到的是 AA B4 04 01 00 A8 4A F0 序列。 这个错误是可重复的,每次我向模块发送给定的命令时。
您有什么意见或建议吗?
【问题讨论】:
-
这里
s_buffer = buff;你能保证buff是空终止的吗? -
我附加了 buff[rc] = '/0' 但它看起来并没有改变结果。但你确实是对的,我应该这样做。