zoukankan      html  css  js  c++  java
  • 树莓派_Linux串口编程_实现自发自收

    串口是计算机上一种很通用设备通信的协议,经常使用PC机上包括的是RS232规格的串口,具有连接线少,通讯简单,得到广泛的使用。
    Linux对全部设备的訪问是通过设备文件来进行的,串口也是这样,为了訪问串口,仅仅需打开其设备文件就可以操作串口设备。在linux系统以下,每个串口设备都有设备文件与其关联,设备文件位于系统的/dev文件夹以下。如linux下的/ttyS0,/ttyS1分别表示的是串口1和串口2。
    树莓派UARTport的位置:见下图的GPIO14(TXD)、GPIO 15(RXD)
    
    
    
    
    
    本文是基于树莓派的环境,树莓派中能够使用串口/dev/ttyAMA0
    
    
    
    
    要使用这个串口,必须先进行设置:
    
    
    1.改动/boot/cmdline.txt
        输入以下指令:
        sudo nano /boot/cmdline.txt
        删除红色部分:
    dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
        终于变为
    dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
        
    2.改动/etc/inittab
        输入以下指令:
        sudo nano /etc/inittab
        凝视掉最后一行内容:
    #T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
    OK、重新启动下raspberry pi如今就能够自己编敲代码測试串口了。我是把TXD与RXD短接,实现自发自收的。
    
    
    程序例如以下:
    recv.h
    #ifndef _RECV_H
    #define _RECV_H
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <string.h>
    #include <errno.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <termios.h>
    
    #define BAUDRATE B115200 ///Baud rate : 115200
    #define DEVICE "/dev/ttyAMA0"
    #define SIZE 1024
    
    #endif

    recv.c
    #include "Recv.h"
    
    int nFd = 0;
    struct termios stNew;
    struct termios stOld;
    
    //Open Port & Set Port
    int SerialInit()
    {
    	nFd = open(DEVICE, O_RDWR|O_NOCTTY|O_NDELAY);
    	if(-1 == nFd)
    	{
    		perror("Open Serial Port Error!
    ");
    		return -1;
    	}
    	if( (fcntl(nFd, F_SETFL, 0)) < 0 )
    	{
    		perror("Fcntl F_SETFL Error!
    ");
    		return -1;
    	}
    	if(tcgetattr(nFd, &stOld) != 0)
    	{
    		perror("tcgetattr error!
    ");
    		return -1;
    	}
    
    	stNew = stOld;
    	cfmakeraw(&stNew);//将终端设置为原始模式,该模式下全部的输入数据以字节为单位被处理
    
    	//set speed
    	cfsetispeed(&stNew, BAUDRATE);//115200
    	cfsetospeed(&stNew, BAUDRATE);
    
    	//set databits  
    	stNew.c_cflag |= (CLOCAL|CREAD);
    	stNew.c_cflag &= ~CSIZE;
    	stNew.c_cflag |= CS8;
    
    	//set parity  
        stNew.c_cflag &= ~PARENB;  
        stNew.c_iflag &= ~INPCK;
    
    	//set stopbits  
        stNew.c_cflag &= ~CSTOPB;
    	stNew.c_cc[VTIME]=0;	//指定所要读取字符的最小数量
    	stNew.c_cc[VMIN]=1;	//指定读取第一个字符的等待时间,时间的单位为n*100ms
    				//假设设置VTIME=0,则无字符输入时read()操作无限期的堵塞
    	tcflush(nFd,TCIFLUSH);	//清空终端未完毕的输入/输出请求及数据。
        if( tcsetattr(nFd,TCSANOW,&stNew) != 0 )
    	{
    		perror("tcsetattr Error!
    ");
    		return -1;
    	}
    
    	return nFd;
    }
    
    int main(int argc, char **argv)
    {
    	int nRet = 0;
    	char buf[SIZE];
    
    	if( SerialInit() == -1 )
    	{
    		perror("SerialInit Error!
    ");
    		return -1;
    	}
    
    	bzero(buf, SIZE);
    	while(1)
    	{
    		nRet = read(nFd, buf, SIZE);
    		if(-1 == nRet)
    		{
    			perror("Read Data Error!
    ");
    			break;
    		}
    		if(0 < nRet)
    		{
    			buf[nRet] = 0;
    			printf("Recv Data: %s
    ", buf);
    		}
    	}
    
    	close(nFd);
    	return 0;
    }

    上面的是接受程序,能够接受字符串信息并打印,发送程序跟上面一样,仅仅要把read改为write即可了,这里就不记录了。
    
    
    程序执行结果:
    
    
    
    
    參考文档:
    http://blog.csdn.net/leaglave_jyan/article/details/6656389
    
    http://www.ibm.com/developerworks/cn/linux/l-serials/index.html
    
    
    
    
    
    
  • 相关阅读:
    atitit.nfc 身份证 银行卡 芯片卡 解决方案 attilax总结
    atitit.php 流行框架 前三甲为:Laravel、Phalcon、Symfony2 attilax 总结
    Atitit.执行cmd 命令行 php
    Atitit. 图像处理jpg图片的压缩 清理垃圾图片 java版本
    atitit。企业组织与软件工程的策略 战略 趋势 原则 attilax 大总结
    atitit. 管理哲学 大毁灭 如何防止企业的自我毁灭
    Atitit.java的浏览器插件技术 Applet japplet attilax总结
    Atitit.jquery 版本新特性attilax总结
    Atitit. 软件开发中的管理哲学一个伟大的事业必然是过程导向为主 过程导向 vs 结果导向
    (转)获取手机的IMEI号
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3803522.html
Copyright © 2011-2022 走看看