appbox之: linux串口测试程序

平台:从网上买的X86平台(baytrail -D (cerelon J1900))

Baytrail平台自带两个串口,基本上就是低端台式机的配置

串口也是同台式机一样

问题:这里将这个X86平台(baytrail cerelon J1900)当成从机设备,

将其接到PC的串口上,一直无输出

解决:串口线两端都是母头,也就是说是直连的,那么这样,baytrail的tx直接与PC的tx相接

所以调了很久都没有任何输出,问题就在于BYT的TX与PC的TX相接,导致PC上看不到BYT设备的输出

所以,调串口设备,一定要注意需要使用交叉线还是直连线,或者说要注意收和发是否对应

另外,上串口测试代码,这也是appbox的一个例程:

#include <stdio.h>
#include <ctype.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <time.h>
#include <dirent.h>
#include <assert.h>
#include <linux/unistd.h>
#include <pthread.h>
#include <semaphore.h>
#include <signal.h>
#include <termios.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <linux/ioctl.h>
#include <sys/times.h>
#include <sys/time.h>
#include <sys/sysinfo.h>
#include <net/if.h>
#include <net/if_arp.h>
#include <net/route.h>
#include <linux/if_ether.h>
#include <arpa/inet.h>
#include <linux/sockios.h>
#include <sys/mman.h>

/*
平台:从网上买的X86平台(baytrail -D (cerelon J1900))
Baytrail平台自带两个串口,基本上就是低端台式机的配置
串口也是同台式机一样

问题:这里将这个X86平台(baytrail cerelon J1900)当成从机设备,
将其接到PC的串口上,一直无输出

解决:串口线两端都是母头,也就是说是直连的,那么这样,baytrail的tx直接与PC的tx相接
所以调了很久都没有任何输出,问题就在于BYT的TX与PC的TX相接,导致PC上看不到BYT设备的输出

另外,上串口测试代码,这也是appbox的一个例程:
*/
typedef unsigned int            DWORD;
typedef unsigned char           BYTE;

#define LINE_MAX_LENGTH		128
#define NAME_MAX_LENGTH 	32
#define MAX_PATH_LENGTH 	128

/// 串口属性结构
typedef struct COMM_ATTR
 {
	DWORD	baudrate;	///< 实际的波特率值。
	BYTE	databits;	///< 实际的数据位数。
	BYTE	parity;		///< 奇偶校验选项,取comm_parity_t类型的枚举值。
	BYTE	stopbits;	///< 停止位数,取comm_stopbits_t类型的枚举值。
	BYTE	reserved;	///< 保留
} COMM_ATTR;

/// 串口停止位类型
enum comm_stopbits_t
{
	COMM_ONESTOPBIT,	///< 1 stop bit
	COMM_ONE5STOPBITS,	///< 1.5 stop bit
	COMM_TWOSTOPBITS	///< 2 stop bit
};

/// 串口校验位类型
enum comm_parity_t
{
	COMM_NOPARITY,	///< No parity
	COMM_ODDPARITY,	///< Odd parity
	COMM_EVENPARITY,///< Even parity
	COMM_MARK,		///<
	COMM_SPACE		///<
};

typedef enum CommType
{
	commBus_485 = 0x0001,
	commBus_422 = 0x0002,
	commBus_232 = 0x0004,
} CommType;

/// 串口操作中断类型
typedef enum CommPurgeFlags
{
	commPurgeTxAbort = 0x0001,	///< 中止写操作
	commPurgeRxAbort = 0x0002,	///< 中止读操作
	commPurgeTxClear = 0x0004,	///< 清空输出缓冲
	commPurgeRxClear = 0x0008 	///< 清空输入缓冲
} CommPurgeFlags;

/// 串口停止位类型
typedef enum CommStopBit
{
	commOneStopBit = 0,		///< 1 stop bit
	commOne5StopBits,		///< 1.5 stop bit
	commTwoStopBits			//< 2 stop bit
} CommStopBit;

/// 串口校验位类型
typedef enum CommParityType
{
	commNoParity = 0,	///< No parity
	commOddParity,		///< Odd parity
	commEvenParity,		///< Even parity
	commMarkParity,		///< Mark parity
	commSpaceParity		///< Space parity
} CommParityType;

/// 特殊串口标志
typedef enum CommSpecialFlag
{
	commNormal = 0,
	commRedApple
} CommSpecialFlag;

/// 串口模式
typedef enum CommMode
{
	commFullDuplex = 0,	///< 全双工
	commSemiDuplex,		///< 半双工
} CommMode;

int uartfd = -1;

int FrontboardSetAttr(COMM_ATTR *ParmaAttribute_p)
{
	struct termios Option;
	COMM_ATTR *Attribute_p = ParmaAttribute_p;

	memset(&Option, 0, sizeof(struct termios));
	tcgetattr(uartfd, &Option);

	if(uartfd < 0)
	{
		printf("Index < 0 || UartSetAttributeEx.\n");
		return -1;
	}

	cfmakeraw(&Option);

	switch(Attribute_p->baudrate)
	{
		case 50:
			cfsetispeed(&Option, B50);
			cfsetospeed(&Option, B50);
			break;
		case 75:
			cfsetispeed(&Option, B75);
			cfsetospeed(&Option, B75);
			break;
		case 110:
			cfsetispeed(&Option, B110);
			cfsetospeed(&Option, B110);
			break;
		case 134:
			cfsetispeed(&Option, B134);
			cfsetospeed(&Option, B134);
			break;
		case 150:
			cfsetispeed(&Option, B150);
			cfsetospeed(&Option, B150);
			break;
		case 200:
			cfsetispeed(&Option, B200);
			cfsetospeed(&Option, B200);
			break;
		case 300:
			cfsetispeed(&Option, B300);
			cfsetospeed(&Option, B300);
			break;
		case 600:
			cfsetispeed(&Option, B600);
			cfsetospeed(&Option, B600);
			break;
		case 1200:
			cfsetispeed(&Option, B1200);
			cfsetospeed(&Option, B1200);
			break;
		case 1800:
			cfsetispeed(&Option, B1800);
			cfsetospeed(&Option, B1800);
			break;
		case 2400:
			cfsetispeed(&Option, B2400);
			cfsetospeed(&Option, B2400);
			break;
		case 4800:
			cfsetispeed(&Option, B4800);
			cfsetospeed(&Option, B4800);
			break;
		case 9600:
			cfsetispeed(&Option, B9600);
			cfsetospeed(&Option, B9600);
			break;
		case 19200:
			cfsetispeed(&Option, B19200);
			cfsetospeed(&Option, B19200);
			break;
		case 38400:
			cfsetispeed(&Option, B38400);
			cfsetospeed(&Option, B38400);
			break;
		case 57600:
			cfsetispeed(&Option, B57600);
			cfsetospeed(&Option, B57600);
			break;
		case 115200:
			cfsetispeed(&Option, B115200);
			cfsetospeed(&Option, B115200);
			break;
		default:
			printf("Unsupported baudrate %d\n", Attribute_p->baudrate);
			return -1;
	}

	switch(Attribute_p->parity)
	{
		case commNoParity:				// none
			Option.c_cflag &= ~PARENB;	// disable parity
			Option.c_iflag &= ~INPCK;	// disable parity check
			break;
		case commOddParity:			// odd
			Option.c_cflag |= PARENB;	// enable parity
			Option.c_cflag |= PARODD;	// odd
			Option.c_iflag |= INPCK;	// enable parity check
			break;
		case commEvenParity:			// even
			Option.c_cflag |= PARENB;	// enable parity
			Option.c_cflag &= ~PARODD;	// even
			Option.c_iflag |= INPCK;	// enable parity check
			break;
		case commMarkParity:
			Option.c_cflag |= PARENB;	/* enable parity	*/
			Option.c_cflag |= PARODD;	/* parity bit is always 1	*/
			break;
		case commSpaceParity:
			Option.c_cflag |= PARENB;	/* enable parity	*/
			break;
		default:
			printf("Unsupported parity %d\n", Attribute_p->parity);
			return -1;
	}

	Option.c_cflag &= ~CSIZE;
	switch (Attribute_p->databits)
	{
		case 5:
			Option.c_cflag |= CS5;
			break;
		case 6:
			Option.c_cflag |= CS6;
			break;
		case 7:
			Option.c_cflag |= CS7;
			break;
		case 8:
			Option.c_cflag |= CS8;
			break;
		default:
			printf("Unsupported data bits %d\n", Attribute_p->databits);
			return -1;
	}

	Option.c_cflag &= ~CSTOPB;
	switch (Attribute_p->stopbits)
	{
		case commOneStopBit:
			Option.c_cflag &= ~CSTOPB;
			break;
		case commOne5StopBits:
			break;

		case commTwoStopBits:
			Option.c_cflag |= CSTOPB;
			break;
		default:
			printf("Unsupported stop bits %d\n", Attribute_p->stopbits);
			return -1;
	}

	Option.c_cc[VTIME] = 0;
	Option.c_cc[VMIN]  = 1;

	tcflush(uartfd, TCIOFLUSH);

	if(tcsetattr(uartfd, TCSANOW, &Option) < 0)
	{
		printf("tcsetattr Failed.\n");
		return -1;
	}

	return 0;
}

int FrontboardCreate(void)
{
	char DeviceName[NAME_MAX_LENGTH] = {0};
	int iFbUartIndex;
	COMM_ATTR UartAttribute;

	memset(&UartAttribute, 0, sizeof(UartAttribute));

	if(uartfd > 0)
	{
		return 0;
	}

	iFbUartIndex = 0;
	snprintf(DeviceName, sizeof(DeviceName),"%s%d", "/dev/ttyS", iFbUartIndex);
	printf("DeviceName:%s\n", DeviceName);

	uartfd = open(DeviceName, O_RDWR);
	if(uartfd < 0)
	{
		printf("Open %s failed.\n", DeviceName);
		return -1;
	}

	UartAttribute.baudrate = 9600;
	UartAttribute.databits = 8;
	UartAttribute.parity   = commNoParity;
	UartAttribute.stopbits = commOneStopBit;

	if(FrontboardSetAttr(&UartAttribute) < 0)
	{
		printf("UartSetAttributeEx Failed. \n");
		return -1;
	}

	return 0;
}

int FrontboardDestory(void)
{
	if(uartfd > 0)
	{
		close(uartfd);
		uartfd = -1;
	}

	return 0;
}

int FrontboardRead(void *pData, DWORD nBytes)
{
	int ReadLength = 0;
	int ReadPosition = 0;

	if(NULL == pData || nBytes < 0)
	{
		printf("Invalid Params, NULL == pData or nBytes < 0.\n");
		return -1;
	}

	memset(pData, 0, nBytes);

	while(0 != nBytes)
	{
		ReadLength = read(uartfd, pData + ReadPosition, nBytes);

		if(ReadLength < 0)
		{
			printf("read Failed, ReadLength < 0.\n");
			return -1;
		}

		ReadPosition += ReadLength;
		nBytes -= ReadLength;
	}

	return ReadPosition;
}

int FrontboardWrite(void *pData, DWORD nBytes)
{
	int WriteLength 	= 0;
	int WritePosition 	= 0;

	if(NULL == pData || nBytes < 0)
	{
		printf("Invalid Params, NULL == pData || nBytes < 0.\n");
		return -1;
	}

	while(0 != nBytes)
	{
		WriteLength = write(uartfd, pData + WritePosition, nBytes);
		if(WriteLength < 0)
		{
			printf("write failed, nBytes:%d, WriteLength:%d\n", nBytes, WriteLength);
			return -1;
		}

		WritePosition += WriteLength;
		nBytes -= WriteLength;
	}

	return WritePosition;
}

int main(int argc, char *argv[])
{
	unsigned char pData[8] = {0};

	pData[0] = 'a';
	pData[1] = 'b';
	pData[2] = 'c';
	pData[3] = 'd';
	pData[4] = '\n';

	FrontboardCreate();

	while(1)
	{
		printf("frontboardwrite:\n");
		FrontboardWrite((void*)pData, 8);
		sleep(1);
	}

	return 0;
}
时间: 2024-10-11 17:58:53

appbox之: linux串口测试程序的相关文章

Linux串口IO模式的一些心得

众所周知,在Linux系统下所有设备都是以文件的形式存在,串口也一样. 通常I/O操作都是有阻塞与非阻塞的两种方式. 其中"超时"这个概念其实是阻塞中的一种处理手段,本质还是属于阻塞的I/O模式. 在Linux中串口的IO操作 本文将它分为三种状态: 阻塞状态 超时状态 非阻塞状态 这三种状态的转换组合有这么几种: 阻塞 --> 超时 阻塞 --> 非阻塞 超时 --> 阻塞 超时 --> 非阻塞 非阻塞 --> 阻塞 我们一个一个来分析 首先在一个串口的

linux 串口0x03,0x13的问题【转】

linux 串口0x03,0x13的问题 本人最近在调linux串口的时候,发现其他数据接收正常,但是0x13怎么也接收不到,后面发现了这篇文章,两天的bug终于解决了,原来是linux底层uart配置问题,现分享给大家 版权所有,转载必须说明转自 http://my.csdn.net/weiqing1981127 原创作者:南京邮电大学  通信与信息系统专业 研二 魏清 环境:mini2440,fl6410,atmel9g45都会出现这样的问题 问题描述:使用RS485串口标准通信,发现大多数

linux串口驱动分析

linux串口驱动分析 硬件资源及描写叙述 s3c2440A 通用异步接收器和发送器(UART)提供了三个独立的异步串行 I/O(SIO)port,每一个port都能够在中断模式或 DMA 模式下操作.UART 使用系统时钟能够支持最高 115.2Kbps 的波特率.每一个 UART 通道对于接收器和发送器包含了 2 个 64 位的 FIFO. 寄存器 名称 地址 在linux中的描写叙述 (2410 和 2440 处理器对内存地址映射关系同样) UART 线性控制寄存器(ULCONn) ULC

linux串口编程参数配置详解

1.linux串口编程需要的头文件 #include <stdio.h>         //标准输入输出定义 #include <stdlib.h>        //标准函数库定义 #include <unistd.h>       //Unix标准函数定义 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>          //文件控制定义 #incl

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

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

Linux串口编程详解

串口本身,标准和硬件 ? 串口是计算机上的串行通讯的物理接口.计算机历史上,串口曾经被广泛用于连接计算机和终端设备和各种外部设备.虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接通常特指那些与RS-232标准兼容的硬件或者调制解调器的接口.虽然现在在很多个人计算机上,原来用以连接外部设备的串口已经广泛的被USB和Firewire替代:而原来用以连接网络的串口则被以太网替代,还有用以连接终端的串口设备则已经被MDA或者VGA取而代之.但是,一方面因为串口本身造价便宜技术成熟,

linux串口编程参数配置详解(转)

1.linux串口编程需要的头文件 #include <stdio.h>         //标准输入输出定义#include <stdlib.h>        //标准函数库定义#include <unistd.h>       //Unix标准函数定义#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>          //文件控制定义#include &l

Linux串口通信

Win8.1-PL2303-树莓派,9600波特率通信正常 参考IBM:http://www.ibm.com/developerworks/cn/linux/l-serials/ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #inclu

Linux串口接收不到0X11数据

转自:http://www.2cto.com/os/201302/189931.html linux串口接收不到0x11解决 网上许多流行的linux串口编程的版本中都没对c_iflag(termios成员变量)这个变量进行有效的设置,这样传送ASCII码时没什么问题,但传送二进制数据时遇到0x0d,0x11和0x13却会被丢掉.不用说也知道,这几个肯定是特殊字符,被用作特殊控制了.关掉ICRNL和IXON选项即可解决. www.2cto.com c_iflag &= ~(ICRNL | IXO