gpt4 book ai didi

c - 使用 C 在 Linux COM 上进行 XBee 串行通信

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:06:51 25 4
gpt4 key购买 nike

我已将我的 XBee 模块(通过 UART 进行通信)连接到我的 PC。我从一个远程节点将数据无线传输到我的 XBee。

我在 Linux 终端上接收字节时遇到问题。虽然我能够将数据传输到远程节点。找到我在 Linux 终端上编写的以下代码以进行串行通信。但是为了调试,我将 XBee 配置为环回。(TXD-RXD 短路)

#include <stdio.h> /* Standard input/output definitions */
#include <string.h> /* String function definitions */
#include <unistd.h> /* UNIX standard function definitions */
#include <fcntl.h> /* File control definitions */
#include <errno.h> /* Error number definitions */
#include <termios.h> /* POSIX terminal control definitions */

//Initialize serial port
int initport(int fd)
{
int portstatus = 0;

struct termios options;

// Get the current options for the port...
tcgetattr(fd, &options);

// Set the baud rates to 9600...
cfsetispeed(&options, B9600);
cfsetospeed(&options, B9600);

// Enable the receiver and set local mode...
options.c_cflag |= (CLOCAL | CREAD);

options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
//options.c_cflag |= SerialDataBitsInterp(8); /* CS8 - Selects 8 data bits */
options.c_cflag &= ~CRTSCTS; // Disable hardware flow control
options.c_iflag &= ~(IXON | IXOFF | IXANY); // Disable XON XOFF (for transmit and receive)
//options.c_cflag |= CRTSCTS; /* Enable hardware flow control */

options.c_cc[VMIN] = 1; //Minimum characters to be read
options.c_cc[VTIME] = 2; //Time to wait for data (tenths of seconds)
options.c_oflag &=~OPOST;
options.c_iflag &=~(ICANON | ECHO | ECHOE | ISIG);
// Set the new options for the port...
tcsetattr(fd, TCSANOW, &options);

//Set the new options for the port...
tcflush(fd, TCIFLUSH);
if (tcsetattr(fd, TCSANOW, &options) == -1)
{
perror("On tcsetattr:");
portstatus = -1;
}
else
portstatus = 1;

return (portstatus);
}

int open_port(void)
{
int fd; /* File descriptor for the port */
fd = open("/dev/ttyUSB1", O_RDWR | O_NOCTTY | O_NONBLOCK);

if (fd == -1)
{
/* Could not open the port. */
perror("Open_port: Unable to open /dev/ttyUSB0 --- \n");
}
else
{message print....};

return (fd);
}

int main(void)
{
int i;
unsigned char write_buf[] =
{0x7E, 0x00, 0x16, 0x10, 0x01, 0x00, 0x13,
0xA2, 0x00, 0x40, 0xE4, 0x22, 0x64, 0xFF,
0xFE, 0x00, 0x00, 0x41, 0x42, 0x43, 0x44,
0x41, 0x42, 0x43, 0x43, 0x7F};

int serial_fd = open_port();

if (serial_fd == -1)
printf("Error opening serial port /dev/ttyUSB0 \n");
else
{
printf("Serial Port /dev/ttyUSB0 is Open\n");
if (initport(serial_fd) == -1)
{
printf("Error Initializing port");
close(serial_fd);
return 0;
}
int n = write(serial_fd, &write_buf, sizeof write_buf);
if (n < 0)
fputs("write() failed!\n", stderr);
else
{
printf("Successfully wrote %d bytes\n", sizeof write_buf);
for (i=0; i<n; i++)
{
printf("%c ",write_buf[i]);
}
}
}
usleep(200000);
char read_buf[128];
int n1 = read(serial_fd, read_buf, sizeof read_buf);

// sleep(1);

if (n1 < 0)
fputs("Read failed!\n", stderr);
else
{
printf("Successfully read from serial port -- %s\n With %d Bytes", read_buf,n1);
}

// sleep(.5);
// usleep(500000);

printf("\n\nNow closing serial port /dev/ttyUSB0 \n\n");
close(serial_fd);

return 0;
}

当我执行这段代码时,它确实显示收到了 1 个字节。我在 read() 之前引入了延迟。但它显示在 Tera Term 上(有点像 super 终端)。此外,我必须在 Xbee 上发送/接收十六进制字符串才能传输,因为它们以 API 模式进行通信。

我该如何解决这个问题?

最佳答案

您等待字节从 XBee 模块传入的时间不够长。尝试将您的 sleep(1) 移动到 read() 之前,并可能将其增加到几秒钟。在尝试调用 read 之前,您可能甚至还没有完成以 9600 波特发送数据!请记住,write() 正在将数据传递给操作系统,并且它经过缓冲以通过串行连接发送出去。

在一个典型的应用程序中,您会有一个循环,在该循环中您尝试定期read(),然后处理从远程端传入的任何内容。请记住,您会以 block 的形式看到它,并且不能只将其打印为字符串。您通常会在字符串中遗漏一个空终止符,如果您有二进制数据,它可能会扰乱您的终端 session 。

当您使用它时,请考虑将您的 XBee 模块配置为 115,200bps 而不是 9600。它的响应速度会快得多。

你可能想看看这个 Open Source ANSI C XBee Host Library我付出了很多努力。它可以针对 POSIX 系统,包括许多层,用于从原始串行到 API 模式,甚至一些 ZigBee 处理(ZDP 端点和 ZCL)的通信。

关于c - 使用 C 在 Linux COM 上进行 XBee 串行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33450159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com