代码拉取完成,页面将自动刷新
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <errno.h>
void configure_serial_port(int fd) {
struct termios options;
tcgetattr(fd, &options);
// 设置波特率
cfsetispeed(&options, B9600);
cfsetospeed(&options, B9600);
// 设置数据位、停止位及奇偶校验
options.c_cflag &= ~PARENB; // 无奇偶校验
options.c_cflag &= ~CSTOPB; // 1个停止位
options.c_cflag &= ~CSIZE; // 清除数据位设置
options.c_cflag |= CS8; // 8位数据位
// 设置流控制
options.c_cflag &= ~CRTSCTS; // 禁用硬件流控制
// 设置为非规范模式(不等待换行符)
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
// 应用设置
tcsetattr(fd, TCSANOW, &options);
}
void write_gpio_value(int value) {
char command[50];
snprintf(command, sizeof(command), "echo %d > /sys/class/gpio/gpio18/value", value);
system(command);
}
void send_request_to_serial(int fd) {
const char request[] = "\x01\x03\x00\x00\x00\x04\x44\x09";
write(fd, request, sizeof(request) - 1); // -1 to exclude null terminator
}
int main() {
int fd;
unsigned char buffer[256];
ssize_t bytes_read;
// 打开串口
fd = open("/dev/ttyS3", O_RDWR | O_NOCTTY);
if (fd == -1) {
perror("打开串口失败");
return EXIT_FAILURE;
}
// 配置串口
configure_serial_port(fd);
printf("开始接收数据...\n");
// 设置 GPIO 引脚为高电平
write_gpio_value(1);
usleep(100); // 等待一段时间,确保 GPIO 设置生效
// 发送请求到串口
send_request_to_serial(fd);
usleep(10000);
printf("请求已发送到串口。\n");
// 设置 GPIO 引脚为低电平
write_gpio_value(0);
usleep(100); // 等待一段时间,确保 GPIO 设置生效
// 接收数据
while (1) {
bytes_read = read(fd, buffer, sizeof(buffer));
if (bytes_read < 0) {
if (errno == EAGAIN || errno == EWOULDBLOCK) {
continue; // 没有数据可读取
} else {
perror("读取数据失败");
break;
}
} else if (bytes_read > 0) {
// 打印接收到的数据
printf("接收到的数据:");
for (ssize_t i = 0; i < bytes_read; i++) {
printf("%02X ", buffer[i]);
}
printf("\n");
}
}
// 关闭串口
close(fd);
return EXIT_SUCCESS;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。