串口是计算机上一种很通用设备通信的协议,经常使用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!\n");
return -1;
}
if( (fcntl(nFd, F_SETFL, 0)) < 0 )
{
perror("Fcntl F_SETFL Error!\n");
return -1;
}
if(tcgetattr(nFd, &stOld) != 0)
{
perror("tcgetattr error!\n");
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!\n");
return -1;
} return nFd;
} int main(int argc, char **argv)
{
int nRet = 0;
char buf[SIZE]; if( SerialInit() == -1 )
{
perror("SerialInit Error!\n");
return -1;
} bzero(buf, SIZE);
while(1)
{
nRet = read(nFd, buf, SIZE);
if(-1 == nRet)
{
perror("Read Data Error!\n");
break;
}
if(0 < nRet)
{
buf[nRet] = 0;
printf("Recv Data: %s\n", 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


树莓派_Linux串口编程_实现自发自收的更多相关文章

  1. 树莓派4B串口测试与开发

    参考文档: https://shumeipai.nxez.com/2021/08/09/raspberry-pi-4-activating-additional-uart-ports.html 树莓派 ...

  2. storysnail的Linux串口编程笔记

    storysnail的Linux串口编程笔记 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据Ge ...

  3. storysnail的Windows串口编程笔记

    storysnail的Windows串口编程笔记 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据 ...

  4. Linux下串口编程【转】

    本文转载自:http://blog.csdn.net/w282529350/article/details/7378388 /************声明:本人只是见到这篇文章对我帮助很大才转载的,但 ...

  5. c# 实现串口编程-操作LED屏幕

    串口编程主要用到SerialPort这个类,主要实现对串口发送字节数组然后点阵屏显示相关信息,其实这个功能很简单下面给大家把整体思路用流程图展现如下:. 其实整体思路就如流程图.下面是整个流程图的一个 ...

  6. PB串口编程资料(转)

    ----MSCOMM32参数基本介绍2008年03月29日 星期六 上午 11:37MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能.MSComm控件在串口编程时非常方便,程序 ...

  7. Linux串口编程(转载)

    在嵌入式Linux中,串口是一个字设备,访问具体的串行端口的编程与读/写文件 的操作类似,只需打开相应的设备文件即可操作.串口编程特殊在于串 口通信时相关参数与属性的设置.嵌入式Linux的串口编程时 ...

  8. Linux串口编程详解(转)

    串口本身,标准和硬件 † 串口是计算机上的串行通讯的物理接口.计算机历史上,串口曾经被广泛用于连接计算机和终端设备和各种外部设备.虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接 ...

  9. linux串口编程总结

    串口本身.标准和硬件 † 串口是计算机上的串行通讯的物理接口.计算机历史上,串口以前被广泛用于连接计算机和终端设备和各种外部设备.尽管以太网接口和USB接口也是以一个串行流进行数据传送的.可是串口连接 ...

随机推荐

  1. 18 4Sum(寻找四个数之和为指定数的集合Medium)

    题目意思:给一个乱序数组,在里面寻找三个数之和为target的所有情况,这些情况不能重复,增序排列 思路:采用3Sum的做法 ps:有见一种用hash的,存任意两个元素的和,然后变成3sum问题,需要 ...

  2. 学习笔记--【转】Parameter与Attribute的区别&servletContext与ServletConfig区别

    原文链接http://blog.csdn.net/saygoodbyetoyou/article/details/9006001   Parameter与Attribute的区别   request. ...

  3. php基础知识【函数】(6)mysql数据库

    一.连接和关闭 1.mysql_connect('example.com:3307', 'root', '123456') --打开一个到 MySQL 服务器的非永久连接 2.mysql_pconne ...

  4. [Android分享] 彻底理解ldpi、mdpi、hdpi、xhdpi、xxhdpi

    来自: http://www.eoeandroid.com/thread-565562-1-1.html?_dsign=42bed080 非常感谢楼主分享 这个问题我相信困惑了好多人包括很多老鸟,而且 ...

  5. TatukGIS-TGIS_ShapeArc.GetPointOnLine

    function GetPointOnLine(const _distance: Double; const _offset: Double; const _part: Integer): TGIS_ ...

  6. 【转】python中List的sort方法(或者sorted内建函数)的用法

    原始出处:http://gaopenghigh.iteye.com/blog/1483864 python列表排序 简单记一下python中List的sort方法(或者sorted内建函数)的用法. ...

  7. iOS触摸事件处理

    iOS触摸事件处理   主要是记录下iOS的界面触摸事件处理机制,然后用一个实例来说明下应用场景. 一.处理机制 界面响应消息机制分两块, (1)首先在视图的层次结构里找到能响应消息的那个视图. (2 ...

  8. ubuntu下配置protobuf

    http://blog.csdn.net/guoyilongedu/article/details/17093811 最近想研究protobuf ,尝试了很多次都没有成功,我用的是ubuntu,在虚拟 ...

  9. Sort it all out

    poj1094:http://poj.org/problem?id=1094 题解(一位大神的分析) 一.当输入的字母全部都在前n个大写字母范围内时: (1)最终的图 可以排序: 在输入结束前如果能得 ...

  10. ReiserFS与EXT3的比较

    ReiserFS与EXT3的比较 最近,我刚从ReiserFS文件系统转到了ext3日志文件系统.我是一个ReiserFS的忠实追随者,并且直到现在我也没有改变我对该文件系统的看法.我之所以转而使用e ...