树莓派外设开发——串口

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 ;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值