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文件作为数据源来读取: ...
随机推荐
- Dell DRAC的重启方法
SSH 22连接后:racadm racreset
- C语言共用体(Union)
通过前面的讲解,我们知道结构体(Struct)是一种构造类型或复杂类型,它可以包含多个类型不同的成员.在C语言中,还有另外一种和结构体非常类似的语法,叫做共用体(Union),它的定义格式为: uni ...
- 通过GCC编译器编译c语言
GCC编译C源代码的四个步骤 GCC编译C源代码有四个步骤:预处理---->编译---->汇编---->链接. 可以利用GCC的参数来控制执行的过程,这样就可以更深入的了解编译C程序 ...
- easyui DataGrid 工具类之 util js
var jq; var tab; var tabsIndex; /** ...
- 20161014001 DataGridView 单元格内容 自动计算
private void T_Form_CY_CBD_D_CellValueChanged(object sender, DataGridViewCellEventArgs e) { ...
- java如何修改java.library.path并且不重启jvm也能生效
先说一下需求吧, 目前在用JCEF实现java程序桌面版包装,源码中需要加载编译好的几个dll文件,而这些文件的路径必然是根据程序安装的路径而变化的,这就需要在程序运行的时候,去动态修改java.li ...
- mkforsela
-- #!/bin/bash #sela.gao # #History: # .根据每行查找出来的结果push进去手机 #result: # :没有编译生成文件 # :没有设置编译环境 echoMsg ...
- python 学习笔记十五 django基础
Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...
- jquery 设置页面元素不可点击、不可编辑、只读(备忘)
$("input").attr('readonly', true); $("textarea").attr('readonly', true); $(':rad ...
- 长时间停留在calculating requirements and dependencies 解决方案
如果Eclipse花费了很长的时间calculating requirements and dependencies(计算需求和依赖性 ) 这个问题通常就是在点击安装之后显示“Calculating ...