1.利用wiringPi库实现串口通信
1.1 准备工作:
使用树莓派串口前需要对树莓派的串口进行简单配置:
配置cmdline.txt文件
sudo vi /boot/cmdline.txt
dwc_otg.lpm_enable=0 【console=ttyAMA0,115200】 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
删除【】之间的部分
删除完如下图所示:
sudo reboot 重启
1.2 硬件接线
gpio readall
可查看树莓派提供的串口引脚 依此接线
1.3 程序实现
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <pthread.h>
#include <wiringPi.h>
#include <wiringSerial.h> //使用串口需要调用的头文件
#include <stdlib.h>
/*
发送线程函数
*/
void *sendHandler(void *args)
{
//这里传入文件描述符fd,需将void*类型转换成 int *类型
int *argptr = (int*)args;
//并将文件描述符赋值
int fd = *argptr;
char *buf;
buf = (char*)malloc(32*sizeof(char));
while(1){
memset(buf,'\0',32);
scanf("%s",buf);
while(*buf!= '\0')
serialPutchar(fd,*buf++);
}
}
int main ()
{
int fd ;
int count ;
unsigned int nextTime ;
pthread_t idSend;
if ((fd = serialOpen ("/dev/ttyAMA0", 9600)) < 0)//树莓派默认 串口设备路径
{
fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno)) ;
return 1 ;
}
if (wiringPiSetup () == -1)
{
fprintf (stdout, "Unable to start wiringPi: %s\n", strerror (errno)) ;
return 1 ;
}
pthread_create(&idSend,NULL,sendHandler,&fd);
while(1){
while (serialDataAvail (fd))
{
printf ("%c", serialGetchar (fd)) ;
fflush (stdout) ;
}
}
printf ("\n") ;
return 0 ;
}
2.利用Linux自带串口函数实现串口通信
mySerial.c文件
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdarg.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
int mySerialOpen(const char *device, const int baud)
{
struct termios options ;
speed_t myBaud ;
int status, fd ;
switch (baud)
{
case 115200:myBaud = B1152000 ; break ;
case 9600 :myBaud = B9600 ; break ;
}
if ((fd = open (device, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK)) == -1)
return -1 ;
fcntl (fd, F_SETFL, O_RDWR) ;
// Get and modify current options:
tcgetattr (fd, &options) ;
cfmakeraw (&options) ;
cfsetispeed (&options, myBaud) ;
cfsetospeed (&options, myBaud) ;
options.c_cflag |= (CLOCAL | CREAD) ;
options.c_cflag &= ~PARENB ;
options.c_cflag &= ~CSTOPB ;
options.c_cflag &= ~CSIZE ;
options.c_cflag |= CS8 ;
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG) ;
options.c_oflag &= ~OPOST ;
options.c_cc [VMIN] = 0 ;
options.c_cc [VTIME] = 100 ; // Ten seconds (100 deciseconds)
tcsetattr (fd, TCSANOW, &options) ;
ioctl (fd, TIOCMGET, &status);
status |= TIOCM_DTR ;
status |= TIOCM_RTS ;
ioctl (fd, TIOCMSET, &status);
usleep (10000) ; // 10mS
return fd ;
}
int mySerialGetString(const int fd,char*buf)
{
int size;
size = read(fd,buf,32);
return size;
}
int mySerialPutString(const int fd,char*buf)
{
int ret;
ret = write(fd,buf,strlen(buf));
if(ret < 0)
{
printf("Serial Puts Error\n");
}
}
mySerial.h文件
int mySerialOpen(const char *device, const int baud);
int mySerialGetString(const int fd,char*buf);
int mySerialPutString(const int fd,char*buf);
serialTest.c文件
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <pthread.h>
#include "mySerial.h"
#include <unistd.h>
#include <stdlib.h>
int fd;
void *receiveHandler()
{
char receBuf[32];
while(1){
memset(receBuf,'\0',32);
mySerialGetString(fd,receBuf);
printf("GET :%s\n",receBuf);
fflush (stdout) ;
}
}
void *sendHandler()
{
char sendBuf[32];
while(1){
memset(sendBuf,'\0',32);
scanf("%s",sendBuf);
mySerialPutString(fd,sendBuf);
}
}
int main(int argc,char **argv)
{
pthread_t SendFunID;
pthread_t ReceiveFunID;
char pathBuf[32] = {'\0'};
if(argc < 2){
printf("Please input the path of usart for example:/dev/ttyAMA0\n");
return -1;
}
strcpy(pathBuf,argv[1]);
fd = mySerialOpen(pathBuf,9600);
pthread_create(&ReceiveFunID,NULL,receiveHandler,NULL);
pthread_create(&SendFunID,NULL,sendHandler,NULL);
while(1);
return 0 ;
}