写串口小程序 serialport-wirte.c

本文介绍了一种在Linux环境下通过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	<string.h>

#define		TRUE	1
#define		FALSE	0

#define		BUFFER_SIZE		1024



// for AM3517 ttyS2 is available. //ttyUSB0

//#define		DEVICE_FILE		"/dev/ttyO0"


int set_opt(int fd, int nSpeed, int nBits, char nEvent, int nStop)
{
	struct termios newtio, oldtio;
	if(tcgetattr(fd, &oldtio) != 0)
	{
		perror("SetupSerial 1");
		return -1;
	}
	bzero(&newtio, sizeof(newtio));
	newtio.c_cflag |= CLOCAL | CREAD;
	newtio.c_cflag &= ~CSIZE;
	switch(nBits)
	{
		case 7:
				newtio.c_cflag |= CS7;
				break;
		case 8:
				newtio.c_cflag |= CS8;
				break;
	}
	switch(nEvent)
	{
		case 'O':
				newtio.c_cflag |= PARENB ;
				newtio.c_cflag |= PARODD ;
				newtio.c_iflag |= (INPCK | ISTRIP);
				break;
		case 'E':
				newtio.c_cflag |= PARENB ;
				newtio.c_cflag &= ~PARODD ;
				newtio.c_iflag |= (INPCK | ISTRIP);
				break;
		case 'N':
				newtio.c_cflag &= ~PARENB ;
				break;
	}
	switch(nSpeed)
	{
		case 4800:
				cfsetispeed(&newtio, B4800);
				cfsetospeed(&newtio, B4800);
				break;
		case 9600:
				cfsetispeed(&newtio, B9600);
				cfsetospeed(&newtio, B9600);
				break;
		case 19200:
				cfsetispeed(&newtio, B19200);
				cfsetospeed(&newtio, B19200);
				break;
		case 57600:
				cfsetispeed(&newtio, B57600);
				cfsetospeed(&newtio, B57600);
				break;
		case 115200:
				cfsetispeed(&newtio, B115200);
				cfsetospeed(&newtio, B115200);
				break;
		default:
				cfsetispeed(&newtio, B115200);
				cfsetospeed(&newtio, B115200);
				break;
	}
	if(1 == nStop)
		newtio.c_cflag &= ~CSTOPB;
	else if(2 == nStop)
		newtio.c_cflag |= CSTOPB;
	newtio.c_cc[VTIME] = 0;
	newtio.c_cc[VMIN] = 1;
	tcflush(fd, TCIFLUSH);
	if((tcsetattr(fd, TCSANOW, &newtio))!=0)
	{
		perror("com set error!");
		return -1;
	}

	return 0;
}



int main(int argc, char **argv)
{
	//char package[BUFFER_SIZE] = "abcdefghijklmnopqrstuvwxyz1234567890";
	//const char package[] = "abcdefghijklmnopqrstuvwxyz1234567890";
	char package[BUFFER_SIZE] = ""; //"abcde12345";
	

	char device[32] = ""; //"/dev/ttyO0";
	int baud_rate = 115200;
	int data_bit = 8;
	int stop_bit = 1;
	char parity = 'N';		
	
	int fd;
	int nread, nwrite;
	int ret;

	char recv_buf[BUFFER_SIZE];
	char total_buf[BUFFER_SIZE];
	
	long total_bytes, total_packages;
	
	int pos, len_package;

	if(argc == 1)
	{
		printf("Usage: %s <device> <sendstring>\n", argv[0]);
		printf("   eg. %s /dev/ttyS0 abcde12345\n", argv[0]);
		return 0;
	}
	
	
	strcpy(device, argv[1]);
	strcpy(package, argv[2]);

	printf("device=%s,baud_rate=%d,data_bit=%d,stop_bit=%d,parity=%c\n", device, baud_rate, data_bit, stop_bit, parity);

	
	// open
	fd = open(device, O_RDWR|O_NOCTTY|O_NDELAY);
	if(-1 == fd)
	{
		perror("Can't open Serial Port");
		return -1;
	}
	if(fcntl(fd, F_SETFL, 0)<0)
	{
		printf("fcntl failed!\n");
		return -1;
	}

	
	// set 
	ret = set_opt(fd, baud_rate, data_bit, parity, stop_bit);
	if(ret < 0)
	{
		perror("Set_opt error!");
		return;
	}	
	
	
	pos = 0;	
	total_bytes = 0;
	total_packages = 0;
	
	len_package = strlen(package);

	while(1)
	{
		nwrite = write(fd, package, len_package);
		
		if(nwrite < 0)
		{
			perror("wirte error");
			break;
		}
		
		total_bytes += nwrite;
		total_packages++;
		
		printf("Total Bytes = %ld, Total Packages = %ld\n", total_bytes, total_packages);
		
		//if(total_packages % 100 == 0)	break;
		usleep(100000);
		
		if(total_bytes >= 1024 * 1024 * 10)
		{
			printf("1024 * 1024 * 10 bytes have been sent.\n");
			close(fd);
			return 0;
		}		
		
	}

    close(fd);
    return 0;
}

### 如何获取或生成 `android-serialport-api.jar` 文件以用于 Android APK 的串口数据收发 为了在 Android 项目中实现串口通信功能,通常需要使用第三方库如 `android-serialport-api`。以下是关于如何获取或生成 `libs/android-serialport-api.jar` 文件的详细说明。 #### 1. 获取预编译的 `android-serialport-api.jar` 可以通过以下方式直接获取预编译的 `android-serialport-api.jar` 文件: - **GitHub 仓库下载**:访问 `android-serialport-api` 的官方 GitHub 仓库[^3],找到项目的 releases 页面,下载已发布的 jar 文件。 - **第三方资源站点**:某些开发者社区或技术博客可能提供该库的直接下载链接。确保从可信来源下载,以避免潜在的安全风险。 #### 2. 编译源码生成 `android-serialport-api.jar` 如果无法找到预编译的 jar 文件,可以手动编译源码生成所需的库文件。以下是具体步骤: ##### 克隆源码 通过 Git 克隆 `android-serialport-api` 的源码仓库: ```bash git clone https://github.com/mik3y/usb-serial-for-android.git ``` ##### 配置开发环境 确保已安装以下工具和环境: - **Android SDK** 和 **NDK**:用于支持本地 C/C++ 代码的编译。 - **Gradle**:构建 Android 项目所需的工具。 ##### 构建项目 打开终端并进入克隆的项目目录,执行以下命令以生成 jar 文件: ```bash ./gradlew clean assembleRelease ``` 成功构建后,生成的 jar 文件通常位于 `build/libs` 目录下。 #### 3. 将 `android-serialport-api.jar` 添加到项目中 将生成或下载的 `android-serialport-api.jar` 文件添加到 Android 项目中: - **复制到 libs 目录**:将 jar 文件放入项目的 `libs` 文件夹。 - **配置 build.gradle**:在模块级别的 `build.gradle` 文件中添加以下依赖项: ```gradle dependencies { implementation files('libs/android-serialport-api.jar') } ``` #### 4. 注意事项 - **权限设置**:确保在 `AndroidManifest.xml` 文件中声明必要的权限[^1],例如 `READ_EXTERNAL_STORAGE` 和 `WRITE_EXTERNAL_STORAGE`。 - **共享用户 ID**:为使应用能够访问系统级串口设备,需设置 `android:sharedUserId="android.uid.system"` 属性[^1]。 - **兼容性问题**:不同设备的串口路径可能有所不同(如 `/dev/ttyS0` 或 `/dev/ttyUSB0`),需根据目标硬件进行适配。 ```xml <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.serialportapp" android:sharedUserId="android.uid.system"> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> </manifest> ``` #### 示例代码:初始化串口通信 以下是一个简单的示例代码,展示如何使用 `android-serialport-api` 初始化串口通信: ```java import android_serialport_api.SerialPort; public class SerialPortHelper { private SerialPort serialPort; private InputStream inputStream; private OutputStream outputStream; public void openSerialPort(String devicePath, int baudRate) throws Exception { File device = new File(devicePath); if (!device.exists()) { throw new Exception("串口设备不存在"); } serialPort = new SerialPort(device, baudRate, 0); inputStream = serialPort.getInputStream(); outputStream = serialPort.getOutputStream(); } public void sendData(byte[] data) throws Exception { if (outputStream != null) { outputStream.write(data); outputStream.flush(); } else { throw new Exception("输出流未初始化"); } } } ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值