嵌入式板子就和普通用的单片机比如stm32开发板,51开发板差不多,他们的串口都很类似,都是直接连上然后在PC机器上用串口软件打开就好了。
我使用的嵌入式开发板上面有8个rs485串口,2个rs232串口以及一个网口,刚开始开发板连接成功后,使用命令
ls /dev/ttyUSB*
显示出所有的串口,这些串口能够使用的前提是你必须连接好硬件,我刚开分配了一个RS232串口用作调试,用SecureCRT上连接了网口和RS232的串口用作终端连接开发板,以为这样就可以实现开发板给XCOM串口软件发送消息,我还试着以为用在PC端口使用vspd虚拟两个端口,一个com1,一个com2,然后理所当然认为com2映射到了ttyUSB2,但是这样是错误的,因为你硬件连接的都不对,这一点困扰了我很久,正确的是那8个RS485串口对应了ttyUSB1-8,通过usb转RS485连接开发板和电脑,编写然后用XCOM打开串口就直接可以通信了。
代码如下:
#include <sys/time.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h> //标准函数库定义
#include <unistd.h> //unix标准函数定义
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> //文件控制定义
#include <termios.h> //POSIX终端控制定义
#define BUF "hello world!"
int main(int argc, char **argv)
{
int fd = -1;
int rv = -1;
struct termios options;//该结构体包含串口的选项
/*struct termios
{
tcflag_t c_iflag; //输入选项
tcflag_t c_oflag; //输出选项
tcflag_t c_cflag; //控制选项
tcflag_t c_lflag; //行选项
cc_t c_cc[NCCS]; //控制字符
}*/
fd = open("/dev/ttyUSB3",O_RDWR|O_NOCTTY|O_NDELAY);//打开串口设备
if(fd < 0)
{
printf("open uart failure:%s\n",strerror(errno));
close(fd);
return -1;
}
printf("open uart successfuly\n");
memset(&options, 0, sizeof(options));
rv = tcgetattr(fd, &options);//获取原有的串口属性的配置
if(rv != 0 )
{
printf("tcgetattr failure:%s\n", strerror(errno));
return -2;
}
options.c_cflag|=(CLOCAL|CREAD);//CREAD开启串行数据接收,CLOCAL并打开本地连接模式
//options.c_cflag &= ~(ECHO |ICANON |ECHOE);
options.c_cflag &= ~CSIZE;//先使用CSIZE做位屏蔽
options.c_cflag |= CS8;//设置8位数据位
options.c_cflag &= ~PARENB;//无校验位
/*设置115200波特率*/
cfsetispeed(&options,B115200);//设置输入波特率
cfsetospeed(&options,B115200);//设置输出波特率
options.c_cflag &= ~CSTOPB;//设置一位停止位
options.c_cc[VTIME] = 0;//非规范模式读取时的超时时间
options.c_cc[VMIN] = 0;//非规范模式读取时的最小字符数
tcflush(fd, TCIFLUSH);
rv=tcsetattr(fd, TCSANOW, &options);//设置终端的属性
if(rv != 0)
{
printf("tcsetattr failure:%s\n",strerror(errno));
close(fd);
return -3;
}
while(1)
{
rv = write(fd, BUF,strlen(BUF)) ;
if(rv < 0)
{
printf("write error:%s\n",strerror(errno));
close(fd);
}
printf("%s\n", BUF);
sleep(3);
}
close(fd);
return 0;
}
现象:
另外的是PC上的XCOM给开发板发消息,开发板处于一直空等状态只有当收到消息后然后打印出这条信息
#include <sys/time.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h> //标准函数库定义
#include <unistd.h> //unix标准函数定义
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> //文件控制定义
#include <termios.h> //POSIX终端控制定义
#define BUF_SIZE 1024
int main(int argc, char **argv)
{
int fd = -1;
int rv = -1;
char buf[BUF_SIZE];
struct termios options;
fd = open("/dev/ttyUSB3", O_RDWR | O_NOCTTY);
if (fd < 0)
{
printf("open uart failure:%s\n", strerror(errno));
close(fd);
return -1;
}
printf("open uart successfuly\n");
memset(&options, 0, sizeof(options));
rv = tcgetattr(fd, &options);
if (rv != 0)
{
printf("tcgetattr failure:%s\n", strerror(errno));
return -2;
}
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_cflag &= ~PARENB;
cfsetispeed(&options, B115200);
cfsetospeed(&options, B115200);
options.c_cflag &= ~CSTOPB;
options.c_cc[VTIME] = 0; // 设置超时为0,表示无限等待
options.c_cc[VMIN] = 1; // 至少读取一个字符
tcflush(fd, TCIFLUSH);
rv = tcsetattr(fd, TCSANOW, &options);
if (rv != 0)
{
printf("tcsetattr failure:%s\n", strerror(errno));
close(fd);
return -3;
}
while (1)
{
rv = read(fd, buf, BUF_SIZE);
if (rv < 0)
{
printf("read error:%s\n", strerror(errno));
close(fd);
return -4;
}
else if (rv == 0)
{
printf("No data received\n");
}
else
{
buf[rv] = '\0'; // 添加字符串结束符
printf("Received message: %s\n", buf);
}
}
close(fd);
return 0;
}