1.串口设置
![在这里插入图片描述](https://img-blog.csdnimg.cn/b9b8f28c1458480088402778bb71ace1.png)
2.串口接入
![在这里插入图片描述](https://img-blog.csdnimg.cn/bd82c9e881bc4df7bac3ff29f122e797.png)
3.消息传输
![在这里插入图片描述](https://img-blog.csdnimg.cn/1e880481c763481b977f679c810abac4.png)
4.消息透传
![在这里插入图片描述](https://img-blog.csdnimg.cn/fdf88fc940ec4088a24731af2c8c1d15.png)
5.mavlink解析
1.mavlink库
将mavlink库添加至项目包含目录
2.常用mavlink消息
mavlink_heartbeat_t 心跳包
mavlink_attitude_t 姿态角、角速度
mavlink_gps_raw_int_t gps信息
mavlink_battery_status_t 电池状态
mavlink_vfr_hud_t 空速地速高度
6.全部代码
com.c
include "com.h"
int open_port(int com_port)
{
int fd;
char *dev[] = {"/dev/ttyUSB3", "/dev/ttyUSB1", "/dev/ttyUSB2"};
printf("open dev [%s]\n",dev[com_port]);
fd = open(dev[com_port], O_RDWR|O_NOCTTY);
if (fd < 0)
{
perror("open serial port");
return(-1);
}
com.h
#ifndef _COM_H_
#define _COM_H_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <unistd.h>
#include <termios.h>
#include <fcntl.h>
int set_com_config(int fd,int baud_rate,int data_bits, char parity, int stop_bits);
int open_port(int com_port);
#endif
main.c
#include "com.h"
#define BUFFER_SIZE 1024
int main(int argc, char *argv[])
{
int fd;
int i;
char *read_buffer[BUFFER_SIZE];
int read_buffer_size;
fd = open_port(0);
if(set_com_config(fd, 57600, 8, 'N', 1) < 0)
{
perror("set_com_config");
return 1;
}
do{
for(i=0;i<1024;i++){
sleep(1);
}
do{
memset(read_buffer,0, BUFFER_SIZE);
read_buffer_size = read(fd, read_buffer, BUFFER_SIZE);
}while(!read_buffer_size);
printf("[0x%04x]\n",read_buffer[BUFFER_SIZE]);
}while(1);
close(fd);
return 0;
}
test.c
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <sys/times.h>
#include <sys/types.h>
#include <termios.h>
#include <unistd.h>
#include <sys/ioctl.h>
#define TTY_DEV "/dev/ttyUSB3"
#define TIMEOUT_SEC(buflen,baud) (buflen*20/baud+2)
#define TIMEOUT_USEC 0
typedef struct{
char prompt;
int baudrate;
char databit;
char debug;
char echo;
char fctl;
char tty;
char parity;
char stopbit;
const int reserved;
}portinfo_t;
typedef portinfo_t *pportinfo_t;
int PortOpen(pportinfo_t pportinfo);
int PortSet(int fdcom, const pportinfo_t pportinfo);
void PortClose(int fdcom);
int PortSend(int fdcom, char *data, int datalen);
int PortRecv(int fdcom, char *data, int datalen, int baudrate);
char *get_ptty(pportinfo_t pportinfo)
{
char *ptty;
switch(pportinfo->tty){
case '0':{
ptty = TTY_DEV"0";
}break;
case '1':{
ptty = TTY_DEV"1";
}break;
case '2':{
ptty = TTY_DEV"2";
}break;
}
return(ptty);
}
int convbaud(unsigned long int baudrate)
{
switch(baudrate){
case 2400:
return B2400;
case 4800:
return B4800;
case 9600:
return B9600;
case 19200:
return B19200;
case 38400:
return B38400;
case 57600:
return B57600;
case 115200:
return B115200;
default:
return B9600;
}
}
int PortSet(int fdcom, const pportinfo_t pportinfo)
{
struct termios termios_old, termios_new;
int baudrate, tmp;
char databit, stopbit, parity, fctl;
bzero(&termios_old, sizeof(termios_old));
bzero(&termios_new, sizeof(termios_new));
cfmakeraw(&termios_new);
tcgetattr(fdcom, &termios_old);
baudrate = convbaud(pportinfo->baudrate);
cfsetispeed(&termios_new, baudrate);
cfsetospeed(&termios_new, baudrate);
termios_new.c_cflag |= CLOCAL;
termios_new.c_cflag |= CREAD;
fctl = pportinfo-> fctl;
switch(fctl){
case '0':{
termios_new.c_cflag &= ~CRTSCTS;
}break;
case '1':{
termios_new.c_cflag |= CRTSCTS;
}break;
case '2':{
termios_new.c_iflag |= IXON | IXOFF |IXANY;
}break;
}
termios_new.c_cflag &= ~CSIZE;
databit = pportinfo -> databit;
switch(databit){
case '5':
termios_new.c_cflag |= CS5;
case '6':
termios_new.c_cflag |= CS6;
case '7':
termios_new.c_cflag |= CS7;
default:
termios_new.c_cflag |= CS8;
}
parity = pportinfo -> parity;
switch(parity){
case '0':{
termios_new.c_cflag &= ~PARENB;
}break;
case '1':{
termios_new.c_cflag |= PARENB;
termios_new.c_cflag &= ~PARODD;
}break;
case '2':{
termios_new.c_cflag |= PARENB;
termios_new.c_cflag |= PARODD;
}break;
}
stopbit = pportinfo -> stopbit;
if(stopbit == '2'){
termios_new.c_cflag |= CSTOPB;
}
else{
termios_new.c_cflag &= ~CSTOPB;
}
termios_new.c_oflag &= ~OPOST;
termios_new.c_cc[VMIN] = 0;
termios_new.c_cc[VTIME] = 1;
tcflush(fdcom, TCIFLUSH);
tmp = tcsetattr(fdcom, TCSANOW, &termios_new);
return(tmp);
}
int PortOpen(pportinfo_t pportinfo)
{
int fdcom;
char *ptty;
ptty = get_ptty(pportinfo);
fdcom = open(ptty, O_RDWR | O_NOCTTY | O_NONBLOCK);
return (fdcom);
}
void PortClose(int fdcom)
{
close(fdcom);
}
int PortSend(int fdcom, char *data, int datalen)
{
int len = 0;
len = write(fdcom, data, datalen);
if(len == datalen){
return (len);
}
else{
tcflush(fdcom, TCOFLUSH);
return -1;
}
}
int PortRecv(int fdcom, char *data, int datalen, int baudrate)
{
int readlen, fs_sel;
fd_set fs_read;
struct timeval tv_timeout;
FD_ZERO(&fs_read);
FD_SET(fdcom, &fs_read);
tv_timeout.tv_sec = TIMEOUT_SEC(datalen, baudrate);
tv_timeout.tv_usec = TIMEOUT_USEC;
fs_sel = select(fdcom + 1, &fs_read, NULL, NULL, &tv_timeout);
if(fs_sel){
readlen = read(fdcom, data, datalen);
return(readlen);
}
else{
return(-1);
}
}
int main(int argc, char *argv[]) {
int fd = -1, SendLen = 0, RecvLen = 0;
struct termios termios_cur;
char RecvBuf[10] = {0};
portinfo_t portinfo = {
'0',
57600,
'8',
'0',
'1',
'1',
'0',
'0',
'1',
0
};
fd = PortOpen(&portinfo);
if (fd < 0) {
printf("Error: open serial port error.\n");
exit(1);
}
PortSet(fd, &portinfo);
char data[9] = {0x11,0x22,0x33,0x11,0x22,0x33,0x11,0x22,0x88};
int datalen = strlen(data);
{
for (int i = 0; i < 100; i++)
{
SendLen = PortSend(fd, data, 9);
if (SendLen > 0) {
printf("No %d send %d data.\n", i, SendLen);
} else {
printf("Error: send failed.\n");
}
sleep(1);
}
}
PortClose(fd);
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)