串口通信需要几个基本的条件:
硬件------串口,这个不用多说,一定都有的
软件------使用的相关的头文件
串口通信的相关的配置基本上博客都是有的,我在这里罗列一下:
它的主要动作是:
一、打开设备
二、设置波特率等等
三、读写函数
四、关闭
具体的可以参考下面这个:
打开串口及串口读写
https://blog.csdn.net/specialshoot/article/details/50707965
https://blog.csdn.net/specialshoot/article/details/50709257
串口主要涉及到termios结构体,这个很重要,可以参考:
下面这个的讲解:
termios的讲解
https://blog.csdn.net/querdaizhi/article/details/7436722
这个需要自己改一下。
但是很多都没有提到完整的接收和发送中断的问题(有的是用进程写的,对我来说有点难度),所以就希望写成中断的方式,希望写一个接收的中断。
具体的文件如下:
#include "serial.hpp"
//using the serial to transmit information
int my_fd;
//char my_buf[30]={"/dev/ttyUSB0"};
char my_buf[30]={"/dev/ttyTHS2"};
int my_nread=0;
int my_nByte=0;
u8 USART_TX_BUF[32];
/**
*@brief 设置串口通信速率
*@param fd 类型 int 打开串口的文件句柄
*@param speed 类型 int 串口速度
*@return void
*/
int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300,
B38400, B19200, B9600, B4800, B2400, B1200, B300, };
int name_arr[] = { 38400, 19200, 9600, 4800, 2400, 1200, 300, 38400,
19200, 9600, 4800, 2400, 1200, 300, };
void set_speed(int fd, int speed)
{
unsigned int i;
int status;
struct termios Opt;
tcgetattr(fd, &Opt);
for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++)
{
if (speed == name_arr[i])
{
tcflush(fd, TCIOFLUSH);
cfsetispeed(&Opt, speed_arr[i]);
cfsetospeed(&Opt, speed_arr[i]);
status = tcsetattr(fd, TCSANOW, &Opt);
if (status != 0)
{
perror("tcsetattr fd");
return;
}
tcflush(fd,TCIOFLUSH);
}
}
}
/**
*@brief 设置串口数据位,停止位和效验位
*@param fd 类型 int 打开的串口文件句柄
*@param databits 类型 int 数据位 取值 为 7 或者8
*@param stopbits 类型 int 停止位 取值为 1 或者2
*@param parity 类型 int 效验类型 取值为N,E,O,S
*/
int set_Parity(int fd,int databits,int stopbits,int parity)
{
struct termios options;
if ( tcgetattr( fd,&options) != 0)
{
perror("SetupSerial 1");
perror("SetupSerial 2");
return(SERIAL_FA