java调用c 串口_基于C语言的java串口通信程序
目录
1.前言
2.windows 串口通信API
3.C/C++封装 动态运行库
4.JAVA-JNI java程序调用C++程序
一、前言
&ensp ;写这个博客主要是因为自己想用java写一个小小的后端服务器,其中要处理由51单片机传送来的一些数据。单片机的数据由USB转串口发送至上位机,要处理这些数据,就会用到windows提供一些API(Application Programming Interface,应用程序接口)。java在安装了相关的包后,比如JNative.jar,可以直接用该包提供的接口来进行调用windowsAPI。但是我才接触java。而且整个作业,我仅仅只要一部分来处理这个数据。安装一个java包,实在是大可不必,所以就用C/C++来写一个的终端,封装一下放在java程序里面。
二、windows串口通信API
2.1 工具:VC++6.0
2.2 概述:windows操作系统的设备无关性将所有的外设都当做文件来操作,那么我们写串口通信就直接将串口当做文件来读写。那么我们打开串口后一定要记得关闭,这个很重要
2.3 串口通信程序概述
2.3.1 打开/关闭串口
HANDLE WINAPI CreateFileW(
LPCWSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode, //共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, //安全属性
DWORD dwCreationDisposition, //指定文件的动作
DWORD dwFlagsAndAttributes, //文件属性---不指定就默认为同步IO
HANDLE hTemplateFile //模板文件
);
BOOL WINAPI CloseHandle(
HANDLE hObject
);
返回值:一个串口的句柄。
参数解释:
lpFileName——串口名字。 当为COM1~COM9的时候可以直接写入但是大于10会有另外的写法。以COM10为例:\.\COM10。
lpFileName——打开方式。 简单来说这个就是打开文件是读还是写。GENERIC_READ(读)|GENERIC_WRITE(写)。还有其它的两个值,详细请在编辑器中直接按下F12看看他们的定义。
如果我们要定义一个同步IO的话,我们的打开方式必须要有读动作。
dwShareMode指定该端口的共享属性。 对于不能共享的串口,它必须设置为0。这就是文件与通信设备之间的主要差异之一。如果在当前的应用程序调用CreateFile()时,另一个应用程序已经打开了串口,该函数就会返回错误代码,原因是两个应用程序不能共享一个端口。然而,同一个应用程序的多个线程可以共享由CreateFile()返回的端口句柄,并且根据安全性属性设置,该句柄可以被打开端口的应用程序的子程序所继承。
dwCreationDisposition指定文件的动作。 指定如果CreateFile()正在被已有的文件调用时应采取的动作。因为串口总是存在,fdwCreate必须设置成OPEN_EXISTING。该标志告诉Windows不用企图创建新端口,而是打开已经存在的端口。
调用该函数后,如果没有穿件成功将会返回INVALID_HANDLE_VALUE。
2.3.2 配置串口通信
(1) 当我们设置同步IO通信的时候,需要设置一下通信超时。一般情况下,我们用GetCommTimeouts来获得COMMTIMEOUTS结构体,再利用SetCommTimeouts来写入。
BOOL WINAPI GetCommTimeouts(
HANDLE hFile,
LPCOMMTIMEOUTS lpCommTimeouts
);
BOOL WINAPI SetCommTimeouts(
HANDLE hFile,
LPCOMMTIMEOUTS lpCommTimeouts
);
COMMTIMEOUTS:
typedef struct _COMMTIMEOUTS {
DWORD ReadIntervalTimeout; /* 设置两个字符之前的最大读取时间 */
DWORD ReadTotalTimeoutMultiplier; /* 设置每个字符的读取时间 */
DWORD ReadTotalTimeoutConstant; /* 设置所有字符读取的最大时间 */
DWORD WriteTotalTimeoutMultiplier; /* 设置每个字符的写入时间 */
DWORD WriteTotalTimeoutConstant; /* 设置所有字符的写入时间 */
} COMMTIMEOUTS,*LPCOMMTIMEOUTS;
(2) 设置波特率等相关参数
仍然先用GetCommState得到DCB结构,修改其中的某些参数后再用SetCommState写入DCB结构。
BOOL WINAPI GetCommState(
HANDLE hFile,
LPDCB lpDCB
);
BOOL WINAPI SetCommState(
HANDLE hFile,
LPDCB lpDCB
);
DCB数据结构我们初级学者需要关注:波特率、校验位、停止位、发送数据位数。
(3) 设置缓冲区大小,根据程序要接收/发送的数据大小来决定。
BOOL WINAPI SetupComm(
HANDLE hFile,
DWORD dwInQueue,
DWORD dwOutQueue
);
(4) 读取/写入数据
BOOL WINAPI ReadFile(
HANDLE hFile,
LPVOID lpBuffer, //存放数据的缓冲区
DWORD nNumberOfBytesToRead, //一次想要读入的数据长度
LPDWORD lpNumberOfBytesRead, //实际读入的数据长度
LPOVERLAPPED lpOverlapped
);
BOOL WINAPI WriteFile(
HANDLE hFile,
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped
);
2.3.3 配置串口通信
java调用c 串口_基于C语言的java串口通信程序相关推荐
- java医院挂号代码_基于SSM开发的Java医院预约挂号系统 源码下载
这是一个基于SSM开发的Java医院预约挂号系统,源码中附带主工程以及数据库文件. 目前已知Bug:因为时间预约信息是假数据,控制预约日历显示的代码在data/index.js,因为js写的有点bug ...
- java实现医嘱管理系统_基于SSM框架的JAVA医嘱管理系统
今天将为大家分析一个医嘱管理系统(随着科学技术的进步,医院规模的不断壮大,计算机在我院的应用已相当广泛,它既能提高工作效率,又能实现信息共享.我院使用医嘱管理系统后,实现了医嘱处理计算机化,医嘱处理方 ...
- java分布式调度框架_基于Redis的分布式Java任务执行和调度框架
Redisson是使用Redis实现分布式任务执行和调度的Java开源项目,它是通过标准JDK的ExecutorService和ScheduledExecutorService API实现的,被提交的 ...
- Java 调用http接口(基于OkHttp的Http工具类方法示例)
目录 Java 调用http接口(基于OkHttp的Http工具类方法示例) OkHttp3 MAVEN依赖 Http get操作示例 Http Post操作示例 Http 超时控制 工具类示例 Ja ...
- java项目----教务管理系统_基于Java的教务管理系统
java项目----教务管理系统_基于Java的教务管理系统 2022-04-22 18:18·java基础 最近为客户开发了一套学校用教务管理系统,主要实现学生.课程.老师.选课等相关的信息化管理功 ...
- c语言编写订货系统,学位论文_基于c语言的仓库订货系统的仿真.doc
学位论文_基于c语言的仓库订货系统的仿真 本科毕业论文(设计.创作) 题目: 基于C语言的仓库订货系统的仿真 学生姓名: 学号: 所在系院: 信息与通信技术系 专业: 电子信息工程 入学时间: 201 ...
- TIA博途_基于SCL语言制作模拟量输入输出全局库的具体方法
TIA博途_基于SCL语言制作模拟量输入输出全局库的具体方法 一. 模拟量输入块:创建FB,定义块的接口,如下图所示: 程序中包含了高报警,低报警,一般上位机报警需要这个变量. 极性选择,适合更广的应 ...
- Java调用Python:实现两大语言的无缝对接
Java调用Python:实现两大语言的无缝对接 Java和Python是两种非常流行的编程语言,它们的应用场景各有不同.但是,在某些情况下,我们需要在Java中使用Python,这时候就需要实现两者 ...
- 图像haar特征提取 c语言,基于C语言的特征点提取程序 本程序是利用C语言对各种信号数据的特征点提取程序 - 下载 - 搜珍网...
基于C语言的特征点提取程序\修改后 特征点提取程序\提取特征点\Debug\football.ilk 基于C语言的特征点提取程序\修改后 特征点提取程序\提取特征点\Debug\football.ob ...
最新文章
- R语言ggplot2可视化使用vjust和hjust参数对齐图像中的文本注释信息(左对齐、右对齐、居中)实战
- 基于ESP32模块利用检测线圈检测车模停止时间,室内视觉AI裁判系统
- CSS实现各类分栏布局
- Centos7.1 命令行与图形化界面登陆
- drbd heartbeat mysql_Heartbeat+DRBD+MySQL Replication故障处理
- mysql 精度_mysql-笔记 精度
- [APIO2013]机器人(DP+SPFA最短路)
- 第三课 SVM(2)
- 我的三年研究生(CS)学习与工作经历(ZT)
- 2018年最新Spring Boot视频教程附代码笔记资料(50G)
- 【OpenCV】图片对比度和亮度
- numpy.random 模块中文文档学习笔记
- SpringBoot作mongodb批量更新
- 猜数字的算法的一个简单实现
- 汉字乱码的终极解决方案
- linux 开根号函数,Linux里隐藏的计算器开根号,问他它的地球未解之谜吗?
- Pandas(数据分析处理库)---讲解
- 声学感知刻度(mel scale、Bark scale、ERB)与声学特征提取(MFCC、BFCC、GFCC)
- 委托(C# 编程指南)
- vue利用事件委托实现按钮互斥,并传递对应的值
热门文章
- C#基础笔记(第十九天)
- python实现按帧数裁剪视频
- promise 以及经典面试题
- 硬盘坏了数据可以恢复吗?盘点数据恢复技巧
- 微信社群机器人Java,做社群一定需要用到微信群机器人吗?看这里你就懂了!...
- java pdf水印排布问题_java实现图片和pdf添加铺满文字水印
- cocos2d js-3.2 PageView的简单使用
- 项目沟通管理干系人管理
- 薄冰-英语语法[2]-冠词的知识点 (易混知识)
- 【深度学习笔记】自建交通标志分类数据集转换为MNIST数据格式