/*******************************************************************************************
* I.MX6 Android Linux UART send receive with multi-thread and multi-mode demo
* 声明:
* 1. 本软件是为了测试Android底层的Linux驱动以及硬件是否存在缺陷而编写的测试软件;
* 2. 本软件可以设置为发送、接收、发送并接收模式,并且提供q+enter键退出程序;
* 3. 本人是采用NDK的方式进行编译的,并采用autorun.sh脚本进行调用,主要是不想敲太多键盘;
* 4. 本程序并不打算给出太多的注释,没有理由;
* 5. 如果想知道波特率更多细节,可以参考本人的《I.MX6 Linux Serial Baud Rate hacking》。
*
* 2015-8-22 晴 深圳 南山平山村 曾剑锋
******************************************************************************************/ \\\\\\\\\-*- 目录 -*-////////
| 一、cat uartRS.c |
| 二、cat Android.mk |
| 三、cat autorun.sh |
\\\\\\\\\\\\\\\////////////// 一、cat uartRS.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>
#include <pthread.h> #define SENDWORKMODE 1
#define RECVWORKMODE 2
#define SENDANDRECVWORKMODE 3 int serial_fd = ;
int serialNumber = ;
int baudRate = ;
int workMode = ; // 1 send; 2 recv; 3 send and recv
char serialString[] = {}; char sendString[] = {};
char recvString[] = {}; int help ( int argc );
int initSerial ( void ); int getBaudRate ( char *baudRateString );
void getSerial ( char* commandLineserialString );
int getWorkMode ( char *workMode ); int uart_send ( int fd, char *data, int datalen );
int uart_recv ( int fd, char *data, int datalen ); pthread_t recv_thread;
void *recvDataThread ( void *arg ); pthread_t quitOut_thread;
void *quitOutThead ( void *arg ); int main(int argc, char **argv)
{ if ( help( argc ) != )
return -; getSerial ( argv[] );
baudRate = getBaudRate ( argv[] );
workMode = getWorkMode ( argv[] ); initSerial (); if ( workMode == RECVWORKMODE || workMode == SENDANDRECVWORKMODE ) {
pthread_create ( &recv_thread, NULL, recvDataThread, NULL );
} pthread_create ( &quitOut_thread, NULL, quitOutThead, NULL ); int i = ;
while ( ) { if ( workMode == SENDWORKMODE || workMode == SENDANDRECVWORKMODE ) {
sprintf ( sendString, "%03d: %s\r\n", i++, argv[] );
uart_send ( serial_fd, sendString, strlen ( sendString ) );
}
usleep ( );
} close ( serial_fd );
return ;
} int getWorkMode ( char *workModeString ) { int ret = atoi( workModeString ); switch ( ret ) {
case :
printf ( "workMode: send.\n" );
break;
case :
printf ( "workMode: recv.\n" );
break;
case :
printf ( "workMode: send and recv.\n" );
break;
default:
printf ( "none of this workMode.\n" );
exit ( );
} return ret;
} void *quitOutThead(void *arg) { //system("stty raw -echo"); can't work well in Android linux
char ch = '\0'; while ( ) {
scanf ( "%c", &ch );
if ( ch == 'q' || ch == 'Q' ) {
exit ( );
}
}
} void *recvDataThread(void *arg) { int ret = ;
int i = ; while ( ) {
ret = uart_recv ( serial_fd, recvString, sizeof(recvString) );
printf ( "%03d %s\n", i++, recvString );
bzero ( recvString, sizeof(recvString) );
usleep ( );
}
} int help( int argc ) { if ( argc != ) {
printf ( "USAGE:\n" );
printf ( " command <serial absolute path> <baudRate> <workMode> <send String>\n" );
printf ( " example:\n" );
printf ( " ./uartRS /dev/ttymxc1 115200 3 \"1234567890ABCDEFG\"\n" );
return -;
} return ;
} int uart_recv(int fd, char *data, int datalen) { int ret = ; ret = read ( fd, data, datalen ); return ret;
} int uart_send(int fd, char *data, int datalen) { int len = ; len = write ( fd, data, datalen ); //实际写入的长度
if(len == datalen) {
return len;
} else {
tcflush(fd, TCOFLUSH); //TCOFLUSH刷新写入的数据但不传送
return -;
} return ;
} int initSerial( void ) { //serial_fd = open( serialString, O_RDWR | O_NOCTTY | O_NDELAY );
serial_fd = open ( serialString, O_RDWR );
if ( serial_fd < ) {
perror ( "open" );
return -;
} // 串口主要设置结构体termios <termios.h>
struct termios options; /**
* 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 = ; //输出模式
options.c_lflag = ; //不激活终端模式
cfsetospeed ( &options, baudRate ); //设置波特率
//cfsetospeed(&options, B2000000); //设置波特率 /* 设置新属性,TCSANOW:所有改变立即生效*/
tcflush ( serial_fd, TCIFLUSH ); //溢出数据可以接收,但不读
tcsetattr ( serial_fd, TCSANOW, &options ); return ;
} void getSerial ( char* commandLineserialString ) { sprintf ( serialString, "%s", commandLineserialString );
printf ( "serialString : %s.\n", serialString );
} /**
* 该函数之所以采用这种方式,主要是为了波特率出错时方便调试
*/
int getBaudRate ( char* baudRateString ) {
int ret = atoi ( baudRateString );
switch ( ret ) {
case :
printf ( "baudRate %s.\n", "" );
ret = B0;
break;
case :
printf ( "baudRate %s.\n", "" );
ret = B50;
break;
case :
printf ( "baudRate %s.\n", "" );
ret = B75;
break;
case :
printf ( "baudRate %s.\n", "" );
ret = B110;
break;
case :
printf ( "baudRate %s.\n", "" );
ret = B134;
break;
case :
printf ( "baudRate %s.\n", "" );
ret = B150;
break;
case :
printf ( "baudRate %s.\n", "" );
ret = B200;
break;
case :
printf ( "baudRate %s.\n", "" );
ret = B300;
break;
case :
printf ( "baudRate %s.\n", "" );
ret = B600;
break;
case :
printf ( "baudRate %s.\n", "" );
ret = B1200;
break;
case :
printf ( "baudRate %s.\n", "" );
ret = B1800;
break;
case :
printf ( "baudRate %s.\n", "" );
ret = B2400;
break;
case :
printf ( "baudRate %s.\n", "" );
ret = B4800;
break;
case :
printf ( "baudRate %s.\n", "" );
ret = B9600;
break;
case :
printf ( "baudRate %s.\n", "" );
ret = B19200;
break;
case :
printf ( "baudRate %s.\n", "" );
ret = B38400;
break;
case :
printf ( "baudRate %s.\n", "" );
ret = B57600;
break;
case :
printf ( "baudRate %s.\n", "" );
ret = B115200;
break;
case :
printf ( "baudRate %s.\n", "" );
ret = B230400;
break;
case :
printf ( "baudRate %s.\n", "" );
ret = B460800;
break;
case :
printf ( "baudRate %s.\n", "" );
ret = B500000;
break;
case :
printf ( "baudRate %s.\n", "" );
ret = B576000;
break;
case :
printf ( "baudRate %s.\n", "" );
ret = B921600;
break;
case :
printf ( "baudRate %s.\n", "" );
ret = B1000000;
break;
case :
printf ( "baudRate %s.\n", "" );
ret = B1152000;
break;
case :
printf ( "baudRate %s.\n", "" );
ret = B1500000;
break;
case :
printf ( "baudRate %s.\n", "" );
ret = B2000000;
break;
case :
printf ( "baudRate %s.\n", "" );
ret = B2500000;
break;
case :
printf ( "baudRate %s.\n", "" );
ret = B3000000;
break;
case :
printf ( "baudRate %s.\n", "" );
ret = B3500000;
break;
case :
printf ( "baudRate %s.\n", "" );
ret = B4000000;
break;
default:
printf ( "baudRate is not exist %s.\n", "" );
ret = B0;
}
//printf ("baudRate %s.\n", baudRateString);
return ret;
} 二、cat Android.mk
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS)
LOCAL_MODULE := uartRs
#LOCAL_STATIC_LIBRARIES :=libpthread
#LOCAL_SHARED_LIBRARIES :=libpthread
LOCAL_STATIC_LIBRARIES :=libpthread
LOCAL_SRC_FILES := uartRS.c
#LOCAL_LDLIBS += -lpthread include $(BUILD_EXECUTABLE) 三、cat autorun.sh
# ./uartRS <serial absolute path> <baudRate> <work mode> <send String>
# .serial absolute path
# the absolute path for serial port, example:
# /dev/ttymxc1
# . referrence baudrate:
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
# . work mode
# . send;
# . recv;
# . send and recv
# . send string
# the string what you want to send chmod ./uartRS # give excute-permission
# ./uartRS <serial absolute path> <baudRate> <work mode> <send String>
./uartRS /dev/ttymxc1 "1234567890ABCDEF"

I.MX6 Android Linux UART send receive with multi-thread and multi-mode demo的更多相关文章

  1. I.MX6 Android Linux shell MMPF0100 i2c 设置数据

    #!/system/bin/busybox ash # # I.MX6 Android Linux shell MMPF0100 i2c 设置数据 # 说明: # 本文主要记录通过shell脚本来设置 ...

  2. I.MX6 Android Linux shell MMPF0100 i2c 获取数据

    #!/system/bin/busybox ash # # I.MX6 Android Linux shell MMPF0100 i2c 获取数据 # 说明: # 本文主要记录通过shell脚本来获取 ...

  3. I.MX6 Android U-blox miniPCI 4G porting

    /************************************************************************** * I.MX6 Android U-blox m ...

  4. I.MX6 Android 5.1 纯Linux、U-Boot编译

    /***************************************************************************** * I.MX6 Android 5.1 纯 ...

  5. I.MX6 Android iperf3 porting failed

    /***************************************************************************** * I.MX6 Android iperf ...

  6. I.MX6 Android netperf

    /***************************************************************************** * I.MX6 Android netpe ...

  7. I.MX6 android 获取framebuffer信息

    /******************************************************************************** * I.MX6 android 获取 ...

  8. I.MX6 Android i2c-tools porting

    /************************************************************************** * I.MX6 Android i2c-tool ...

  9. I.MX6 android BatteryService jni hacking

    /**************************************************************************** * I.MX6 android Batter ...

随机推荐

  1. 使用innerHTML时要注意的一点

    为某个元素添加内容时,使用的是document.getElementsByClassName,由于只有一个元素拥有这样的ClassName,就直接这样用,document.getElementsByC ...

  2. 解决“centos 下bash: g++: 未找到命令...”

    简单测试一个C++的“Hello World”,发现报错:“bash: g++: 未找到命令...”,因为没有安装编译器G++:然后就百度,出现一大堆的解决办法,什么“sudo apt-get ins ...

  3. InChat版,仅仅两个接口实现自己的IM系统(可兼容)

    InChat 一个IM通讯框架 一个轻量级.高效率的支持多端(应用与硬件Iot)的异步网络应用通讯框架.(核心底层Netty) 版本目标:完成基本的消息通讯(仅支持文本消息),离线消息存储,历史消息查 ...

  4. js 中的几个假值

    1. 使用场景 if分支语句   /  短路语句while循环语句for里的第二个语句 2. 6个假值 (都属于 原始类型数据的一部分内容,非原始类型即对象都是真值,如:对象.数组.正则.函数   . ...

  5. 【Golang 接口自动化05】使用yml管理自动化用例

    我们在前面几篇文章中学习怎么发送数据请求,怎么处理解析接口返回的结果,接下来我们一起来学习怎么进行测试用例管理,今天我们介绍的是使用yml文件进行用例管理,所以首先我们一起来了解一下YAML和它的简单 ...

  6. PHP标准库SPL

    SPL是Standard PHP Library(PHP标准库)的缩写.用来解决典型(常见)问题(common problems)的一组接口与类的集合 典型问题(common problems) - ...

  7. ThreadLocal实现原理

      一.ThreadLocal介绍     这是一个线程的局部变量.也就是说,只有当前线程可以访问.既然是只有当前线程可以访问的数据,自然是线程安全的.     为每一个线程分配不同的对象,需要在应用 ...

  8. 20170801xlVBA含有公式出现弹窗合并

    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Public Sub GatherD ...

  9. Vue.js教程--基础2(事件处理 表单输入绑定

    事件处理 表单输入绑定 事件处理 监听v-on 监听 DOM 事件,并在触发时运行一些 JavaScript 代码. 可以在v-on:click=''加内联语句. 有时也需要在内联语句处理器中访问原始 ...

  10. spoj The Next Palindrome

    题意:比给出的数大的最小回文数. 先用前n/2长对称到后面,如果没变大,在中间加1,进位,再对称. //#pragma comment(linker,"/STACK:1024000000,1 ...