串口编程(基于tiny4412)

参考:

http://www.cnblogs.com/wblyuyang/archive/2011/11/21/2257544.html

http://www.cppblog.com/amazon/archive/2010/01/28/106644.html

serial_demo.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> //文件控制定义
#include <termios.h>//终端控制定义
#include <errno.h>

#define DEVICE "/dev/ttySAC3"

int serial_fd = 0;

//打开串口并初始化设置
int init_serial(void)
{
    serial_fd = open(DEVICE, O_RDWR | O_NOCTTY | O_NDELAY);
    if (serial_fd < 0) {
        perror("open");
        return -1;
    }

    //串口主要设置结构体termios <termios.h>
    struct termios options;

    /**1. tcgetattr函数用于获取与终端相关的参数。
     *参数fd为终端的文件描述符,返回的结果保存在termios结构体中
     */
    tcgetattr(serial_fd, &options);
    /**2. 修改所获得的参数*/
    options.c_cflag |= (CLOCAL | CREAD);//设置控制模式状态,本地连接,接收使能
    options.c_cflag &= ~CSIZE;//字符长度,设置数据位之前一定要屏掉这个位
    options.c_cflag &= ~CRTSCTS;//无硬件流控
    options.c_cflag |= CS8;//8位数据长度
    options.c_cflag &= ~CSTOPB;//1位停止位
    options.c_iflag |= IGNPAR;//无奇偶检验位
    options.c_oflag = 0; //输出模式
    options.c_lflag = 0; //不激活终端模式
    cfsetospeed(&options, B115200);//设置波特率

    /**3. 设置新属性,TCSANOW:所有改变立即生效*/
    tcflush(serial_fd, TCIFLUSH);//溢出数据可以接收,但不读
    tcsetattr(serial_fd, TCSANOW, &options);

    return 0;
}

/**
 *串口发送数据
 *@fd:串口描述符
 *@data:待发送数据
 *@datalen:数据长度
 */
int uart_send(int fd, char *data, int datalen)
{
    int len = 0;
    len = write(fd, data, datalen);//实际写入的长度
    if(len == datalen) {
        return len;
    } else {
        tcflush(fd, TCOFLUSH);//TCOFLUSH刷新写入的数据但不传送
        return -1;
    }

    return 0;
}

/**
 *串口接收数据
 *要求启动后,在pc端发送ascii文件
 */
int uart_recv(int fd, char *data, int datalen)
{
    int len=0, ret = 0;
    fd_set fs_read;

    FD_ZERO(&fs_read);
    FD_SET(fd, &fs_read);

    ret = select(fd+1, &fs_read, NULL, NULL, NULL);
    printf("ret = %d\n", ret);

    if (FD_ISSET(fd, &fs_read)) {
        len = read(fd, data, datalen);
        printf("len = %d\n", len);
        return len;
    } else {
        perror("select");
        return -1;
    }

    return 0;
}

int main(int argc, char **argv)
{
    char buf[100];
    char read_buf[100];
    char write_buf[100];
    int len, i, n;

    init_serial();

    printf("\n");

    while (1) {
        memset(buf, 0, sizeof(buf));
        len = uart_recv(serial_fd, buf, sizeof(buf));
        printf("uart receive %s\n", buf);
        uart_send(serial_fd, buf, len);
    }

    close(serial_fd);
    return 0;
}

完。

时间: 2024-08-14 01:20:40

串口编程(基于tiny4412)的相关文章

基于树莓派的Linux串口编程_实现自发自收

串口是计算机上一种非常通用设备通信的协议,常用PC机上包含的是RS232规格的串口,具有连接线少,通讯简单,得到广泛的使用. Linux对所有设备的访问是通过设备文件来进行的,串口也是这样,为了访问串口,只需打开其设备文件即可操作串口设备.在linux系统下面,每一个串口设备都有设备文件与其关联,设备文件位于系统的/dev目录下面.如linux下的/ttyS0,/ttyS1分别表示的是串口1和串口2. 树莓派UART端口的位置:见下图的GPIO14(TXD).GPIO 15(RXD) 本文是基于

基于MODBUS-RTU协议的串口编程

首先给大家描述一下当前样例串口编程的场景,使用一个水位传感器来测试水库水位的高度,水位传感器连接数据采集器,数据采集器通过485串口和USB口转换器和电脑连接,电脑程序通过USB口读取水位传感器上传到采集器的数据,网络连接如下图所示: 样例代码如下,代码中"int hight = (list[3] - 4000) /160;"这个公式就可以获取到水位的高度,这个是比较难理解的,为什么这样就可以得到高度呢,其实这个公式是不完整的,完整公式是这样的:(传感器返回的电流值 - 传感器可输出电

基于TINY4412的Andorid开发-------简单的LED灯控制【转】

本文转载自:http://www.cnblogs.com/pengdonglin137/p/3857724.html 基于TINY4412的Andorid开发-------简单的LED灯控制 阅读目录(Content) 一.编写驱动程序 二.编写代码测试驱动程序 三.编写HAL代码 四.编写Framework代码 五.编写JNI代码 六.编写App 参考资料: <Andriod系统源代码情景分析> <嵌入式Linux系统开发完全手册_基于4412_上册> 作者:彭东林 邮箱:[em

Linux 程序设计学习笔记----终端及串口编程基础之概念详解

转载请注明出处,谢谢! linux下的终端及串口的相关概念有: tty,控制台,虚拟终端,串口,console(控制台终端)详解 部分内容整理于网络. 终端/控制台 终端和控制台都不是个人电脑的概念,而是多人共用的小型中型大型计算机上的概念. 1.终端 一台主机,连很多终端,终端为主机提供了人机接口,每个人都通过终端使用主机的资源. 终端有字符哑终端和图形终端两种. 控制台是另一种人机接口, 不通过终端与主机相连, 而是通过显示卡-显示器和键盘接口分别与主机相连, 这是人控制主机的第一人机接口.

Java串口编程

最近由于项目的需要,需要用到java串口和windows端java程序的通讯,笔者也是刚刚接触串口这一模块,在网上搜索了很多的串口编程实例之类的,几乎前篇一律吧,但是串口通讯之前的配置是非常重要的,如果配置没有成功,编程也显得没有意义.串口编程主要有两种接口,第一种是利用sun提供的comm.jar包,这种方式比较古老了,这个包也没有更新.第二种就是RXTX模式,这种模式其实和comm.jar包的模式几乎是一样的.下面就记下我学习和使用此模块的记录.RXTX资源包,网上有很多,但要注意的是看你的

Window API串口编程

虽然使用诸如 CSerialPort VC串口类,MSComm VC 串口控件等非常方便,但有时这些控件并不适合自己的特殊需求,所以有必要了解一下基于Windows API的串口编程方法,下面介绍一下API串口编程的一般步骤及相关串口API函数. 串口操作一般有四步,分别是: 1) 打开串口 2) 配置串口 3) 读写串口 4) 关闭串口 1. 打开串口 在<VC 打开串口>一文中我们已经单独介绍过如果利用API打开串口的方法,打开串口是用API函数CreateFile来打开或创建的.该函数的

【转】VS2010下MFC的串口编程

串口通信简介 一般来说,计算机都有一个或多个串行端口,这些串口提供了外部设备与PC进行数据传输和通信的通道,在CPU和外设之间充当解释器的角色.当字符数据从CPU发送给外设时,这些字符数据将被转换成串行比特流数据:当接收数据时,比特流数据被转换为字符数据传递给CPU,再进一步说,在操作系统方面,Windows用通信驱动程序(COMM.DRV)调用API函数发送和接收数据:当用通信控件或声明调用API函数时,它们由COMM.DRV解释并传递给设备驱动程序.作为一个程序员,要编写通信程序,只需知道通

VS2010下MFC的串口编程

串口通信简介 一般来说,计算机都有一个或多个串行端口,这些串口提供了外部设备与PC进行数据传输和通信的通道,在CPU和外设之间充当解释器的角色.当字符数据从CPU发送给外设时,这些字符数据将被转换成串行比特流数据:当接收数据时,比特流数据被转换为字符数据传递给CPU,再进一步说,在操作系统方面,Windows用通信驱动程序(COMM.DRV)调用API函数发送和接收数据:当用通信控件或声明调用API函数时,它们由COMM.DRV解释并传递给设备驱动程序.作为一个程序员,要编写通信程序,只需知道通

Linux下串口编程【转】

本文转载自:http://blog.csdn.net/w282529350/article/details/7378388 /************声明:本人只是见到这篇文章对我帮助很大才转载的,但是这个完整的程序里面本来有语法错误的,现在让我改过来了************/ --------------------------------------------------------- Author             :tiger-johnWebSite            :b

串口编程补充

首先声明此文只适合我这等串口编程新手,也欢迎大神吐槽 参数转换问题: /// <summary> /// 数据转换 /// </summary> /// <param name="values">要转换的byte数组</param> /// <param name="factor">计算因子</param> /// <param name="reh">高位字符&l