SAP连接电脑串口读数(电子称,磅等数据读取)
这是几年前做的了,一直都不想分享出来,后来想想为了能够给大家点想法,献出来了。。。
这是一个电脑读称的方法,一般用COMM口连接的电子设备都可参考。
如果是对串口参数不确定的,可以网上找个串口测试工具,轻松测出串口参数
网上搜索MSCOMM32.OCX
1.将上面的MSCOMM32.OCX保存到系统目录下C:\Windows\SysWOW64\MSCOMM32.OCX
然后注册:REGSVR32 C:\Windows\SysWOW64\MSCOMM32.OCX
2.修改注册表:
REGEDIT
在HKEY_CLASSES_ROOT\Licenses下建一项:
4250E830-6AC2-11cf-8ADB-00AA00C00905
修改数值数据:kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun
重新启动电脑,这样COMM组件就能使用了
以上是在PC上配置的数据。
登陆GUI
T-code: SOLE
新建条目:
OLE 应用程序 MSCOMMLIB.MSCOMM.1
版本号
类标识 {648A5600-2C6E-101B-82B6-000000000014}
CLSID 库类型
OLE 对象名
类型信息键值
包含程序
语言
检查权限
文本
FUNCTION z_bc_get_balance.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" REFERENCE(MODE) TYPE I DEFAULT 0
*" REFERENCE(COMMPORT) TYPE I DEFAULT 1
*" VALUE(SETTINGS) TYPE C DEFAULT '1200,N,8,1'
*" REFERENCE(I_INPUT) TYPE C OPTIONAL
*" EXPORTING
*" REFERENCE(E_OUTPUT) TYPE C
*" EXCEPTIONS
*" NO_CREATE_OBJECT
*"---------------------------------------------------------------------- TYPE-POOLS:sabc.
INCLUDE ole2incl.
DATA pos TYPE i.
CLEAR: pos,balance,value,e_output.
PERFORM prm_get_settings CHANGING settings.
* WAIT UP TO 3 SECONDS.
PERFORM prm_init.
PERFORM prm_open_port USING commport settings.
IF mode = ."读取串口数据
PERFORM prm_read_port CHANGING e_output.
ELSEIF mode = ."写串口数据
PERFORM prm_write_port USING i_input CHANGING e_output.
ENDIF.
PERFORM prm_final.
SEARCH balance FOR '+'.
IF sy-subrc = .
pos = sy-fdpos.
SHIFT balance BY ( pos + ) PLACES.
ENDIF.
SEARCH balance FOR 'g'.
IF sy-subrc = .
pos = sy-fdpos.
balance = balance+(pos).
CONDENSE balance NO-GAPS.
e_output = balance.
ENDIF.
COMMIT WORK
ENDFUNCTION. 此块为配置接口类型模块(自建表用IP地址来配置相应的comm口参数)
*****************************************************************************
FORM prm_get_settings CHANGING p_settings.
DATA addr TYPE ni_nodeaddr.
CLEAR addr.
CALL FUNCTION 'TH_USER_INFO'
IMPORTING
addrstr = addr.
SELECT SINGLE setting INTO p_settings FROM zbctaddr WHERE addr = addr.
IF sy-subrc = .
CLEAR addr.
ENDIF.
ENDFORM. " PRM_GET_SETTINGS 初始化接口对象
******************************************************************************
FORM prm_init .
DATA:
wa_repid LIKE sy-repid.
CLEAR wa_repid.
wa_repid = sy-repid.
CALL FUNCTION 'AUTHORITY_CHECK_OLE'
EXPORTING
program = wa_repid
activity = sabc_act_call
application = 'MSCOMMLIB.MSCOMM.1'
EXCEPTIONS
no_authority =
activity_unknown =
OTHERS = .
IF sy-subrc <> .
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
CREATE OBJECT o_obj 'MSCOMMLib.MSComm.1'.
IF sy-subrc <> .
RAISE no_create_object.
ENDIF.
ENDFORM. " PRM_INIT 接口打开
***************************************************************************
FORM prm_open_port USING commport
settings. SET PROPERTY OF o_obj 'CommPort' = commport.
SET PROPERTY OF o_obj 'Settings' = settings.
SET PROPERTY OF o_obj 'InputLen' = .
SET PROPERTY OF o_obj 'PortOpen' = .
ENDFORM. " PRM_OPEN_PORT 读取接口数据:因为接口有缓存所以每次读取时都是去掉前面20次的数据
而且每次读取的数据都是不完整的,所以需要将多次读取的数据连接起来,然后截取
****************************************************************************
FORM prm_read_port CHANGING e_output.
DATA:
wa_buffer TYPE i,
inde TYPE i.
DO TIMES.
inde = inde + .
GET PROPERTY OF o_obj 'InBufferCount' = wa_buffer.
IF wa_buffer > .
GET PROPERTY OF o_obj 'Input' = e_output.
IF inde < .
ELSE.
CONCATENATE balance e_output INTO balance.
ENDIF.
ENDIF.
ENDDO.
CLEAR:wa_buffer,inde.
ENDFORM. " PRM_READ_PORT 往串口写数据,因为没有需求所以没做测试
*********************************************************************
FORM prm_write_port USING i_input
CHANGING e_output.
DATA:
wa_buffer TYPE i.
SET PROPERTY OF o_obj 'Output' = i_input.
DO TIMES.
GET PROPERTY OF o_obj 'InBufferCount' = wa_buffer.
IF wa_buffer > .
GET PROPERTY OF o_obj 'Input' = e_output.
EXIT.
ENDIF.
ENDDO.
ENDFORM. " PRM_WRITE_PORT 读数结束,关闭串口,释放对象,清空变量
************************************************************************
FORM prm_final .
SET PROPERTY OF o_obj 'PortOpen' = .
FREE OBJECT o_obj.
CLEAR o_obj.
COMMIT WORK.
ENDFORM. " PRM_FINAL
对读数做了个简单的处理
FORM PRM_READ_PORT02 CHANGING E_OUTPUT.
DATA:
WA_BUFFER TYPE I,
INDE TYPE I,LV_CHAR TYPE C.
DATA:LV_STR TYPE STRING VALUE '0123456789.'.
DATA:LV_STR2 TYPE STRING.
DATA:LV_STR3 TYPE STRING.
DATA POS TYPE I.
CLEAR:LV_CHAR,LV_STR2,INDE,LV_STR3,POS.
WHILE LV_CHAR IS INITIAL.
GET PROPERTY OF O_OBJ 'InBufferCount' = WA_BUFFER.
IF WA_BUFFER > . GET PROPERTY OF O_OBJ 'Input' = E_OUTPUT.
SEARCH E_OUTPUT FOR '+'.
IF SY-SUBRC = .
POS = SY-FDPOS.
SHIFT E_OUTPUT BY ( POS + ) PLACES.
ELSE.
CONTINUE.
ENDIF. SEARCH E_OUTPUT FOR 'g'.
IF SY-SUBRC = .
POS = SY-FDPOS.
E_OUTPUT = E_OUTPUT+(POS).
CONDENSE E_OUTPUT NO-GAPS.
E_OUTPUT = E_OUTPUT.
ELSE.
CONTINUE.
ENDIF. * SEARCH E_OUTPUT FOR '.'.
* IF SY-SUBRC = 0.
* ELSE.
* CONTINUE.
* ENDIF
*.
CLEAR:LV_STR2.
MOVE E_OUTPUT TO LV_STR2.
IF LV_STR2 CO LV_STR.
* INDE = INDE + 1.
* IF INDE = 1.
* MOVE E_OUTPUT TO LV_STR3.
* ELSEIF INDE = 2.
* CLEAR:INDE.
* IF LV_STR2 = LV_STR3.
LV_CHAR = 'X'.
* ENDIF.
* ENDIF.
ENDIF.
ENDIF.
ENDWHILE.
CLEAR:WA_BUFFER,INDE.
ENDFORM. " PRM_READ_PORT02
以字符流传过来的,在处理的时候,自己看着办了。。。
SAP连接电脑串口读数(电子称,磅等数据读取)的更多相关文章
- C#:蓝牙串口读数据和写数据
首次使用C#编写与COM口有关的程序,期间遇到了很多问题,写下自己的经验总结,如有错漏,欢迎批评指正! 1.新建一个串口类( SerialPort类) //Create a serial port f ...
- 手机通过数据线连接电脑后,找不到设备--Android Studio
手机通过数据线连接电脑后,找不到可用的设备.允许USB调试,,因为小米手机还要设置USB开发者模式. 1.打开设置/关于手机 四次点击“MIUI版本”如图: 2.返回上一页打开更多设置 看到开发者选项 ...
- 使用RXTX获取电脑串口
RXTX是javacomm串口通信的一个扩展 RXTX开发所需文件的下载地址:http://rxtx.qbang.org/wiki/index.php/Download 解压之后可以看到支持各个平台的 ...
- 【android】安卓手机连接电脑了,但是adb devices找不到设备及找到设备但无权限的问题
安卓手机连接电脑的时候,会遇到adb连接失败,adb devices为空,或者连接成功,但是显示unauthorized的情况.遇到这种情况,一般认为是手机驱动安装失败,会选择重新下载安装驱动,如果还 ...
- iPhone如何设置自定义铃声?无需连接电脑,轻松几步就搞定!
转载自: https://baijiahao.baidu.com/s?id=1594988016778457969&wfr=spider&for=pc 受够了iPhone自带的千篇一律 ...
- 连接电脑时,无法启用USB调试
原因: 手机悬浮球 解决方案: 取消悬浮球,停止一切悬浮应用 (下面的废话可以不听) 预置条件: 手机已经打开开发者模式 开启USB调试模式 电脑能检测到手机 故事背景: 经常用手机连接电脑进行adb ...
- 手机连接电脑,使用adb命令
手机连接电脑使用adb命令,主要是有2种方式,其中最常见的就是第一种,用usb连线使用 1:adb usb - restarts the adbd daemon listening on USB ad ...
- 真机连接电脑后,adb devices显示为空-解决方案
真机:小米6x,adb版本 真机连接电脑后,在cmd中输入adb devices,显示为空. 原因是真机没开启开发者选项和USB调试. 解决方案: 手机的[设置]-[我的设备]-[全部参数],多次点击 ...
- C#读取Excel文件:通过OleDb连接,把excel文件作为数据源来读取
转载于:http://developer.51cto.com/art/200908/142392.htm C#读取Excel文件可以通过直接读取和OleDb连接,把excel文件作为数据源来读取: ...
随机推荐
- Salesforce 执行顺序
在服务器上,Salesforce按以下顺序执行: 1,从数据库加载原始记录或初始化一个用于更新插入(upsert)语句的记录. 2,从请求加载新记录的字段值并覆盖旧的值. 如果请求来自一个标准的UI( ...
- php就业网版本已改版成功
php就业网简介:www.php91.net,专注于Thinkphp框架教程的php框架学习中心.同时也有小崔老师自学php的教程,与你一起成长哦 同时,php就业网教程部分:http://www.p ...
- Windows下部署Appium教程(Android App自动化测试框架搭建)
摘要: 1,appium是开源的移动端自动化测试框架: 2,appium可以测试原生的.混合的.以及移动端的web项目: 3,appium可以测试ios.android.firefox os: 4,a ...
- edittext把软键盘上的回车键改为搜索、发送或者 下一步,窗口随软键盘弹出而改变。
http://m.blog.csdn.net/article/details?id=51350501 以上博文讲解很详细. 如图所示,有时候为了布局美观,在搜索时没有搜索按钮,而是调用软件盘上的按钮. ...
- angular的promise理解
promise承诺是angular的一个重点部分,是一种异步处理值(或非值)的方法.一般程序是从上至下执行,遇到某个地方需要花点时间,就干等着把这个地方执行完了,才继续做下一个,看着有点笨蛋.而pro ...
- Angular.js 的初步认识
MVC模式 模型(model)-视图(view)-控制器(controller) Angular.js采用了MVC设计模式的开源js框架 1.如何在angular.js建立自己的模块(model),控 ...
- js对象/数组深度复制
今天碰到个问题,js对象.数组深度复制:之前有见过类似的,不过没有实现函数复制,今晚想了一下,实现代码如下: function clone(obj) { var a; if(obj instanceo ...
- 一个div里有多个a标签,改变a标签的字体颜色方法
<script type="text/javascript">var all=document.getElementById("big");var ...
- c++共享内存(转载)
对于连个不同的进程之间的通信,共享内存是一种比较好的方式,一个进程把数据发送到共享内存中, 另一个进程可以读取改数据,简单记录一下代码 #define BUF_SIZE 256 TCHAR szNam ...
- JSON生成c#类代码小工具
JSON生成c#类代码小工具 为什么写这么个玩意 最近的项目中需要和一个服务端程序通讯,而通讯的协议是基于流行的json,由于是.net,所以很简单的从公司代码库里找到了Newtonsoft.dll( ...