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文件作为数据源来读取: ...
随机推荐
- MKRCVCD-MKRCVCDSER.exe can't start in service
Logfile contents: 2016/11/23 02:15:09 NamePipeSer Log Start.2016/11/23 02:15:09 Start C:\Program Fil ...
- maven生命周期和插件
maven生命周期和插件 生命周期 maven的生命周期有三套,互相独立.每个生命周期含有不同阶段,常用如下 clean 清理项目 pre-clean 执行清理前需要完成的工作 clean 清理上一次 ...
- hadoop-2.6.0-src源码导入Eclipse 转载
转载地址:http://m.blog.csdn.net/blog/le119126/42009281 一.导入 先修改源码 参考 二.改错里面的第3条 1.cd到 hadoop-2.6.0-src/h ...
- js+jquery的等价用法
js: 获取属性的值: document.getElementById("id").value; 设置属性的样式: document.getElementById("id ...
- treeview所有节点递归解法(转+说明)或者说递归的实际应用
public void PrintTreeViewNode(TreeNodeCollection node) { foreach (TreeNode n in node) { Response.Wri ...
- javascript之聊天室(单机)来自于冷的锋刃
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Logstash学习-配置语法
区段(section) Logstash 用{}来定义区域.区域内可以包括插件区域定义,你可以在一个区域定义多个插件,插件区域内则可以定义键值对设置. 数据类型 Logstash支持少量的数据值类型: ...
- prince2 证书有用吗
prince2 证书有用吗 ? 项目管理是一件非常困难的事情,新闻里充斥着虽利润高却未能成功支付的项目案例.这是为什么呢? 最主要的原因是项目工作比日常的商业工作要困难的多.日常的商业工作往往是重复 ...
- 初学者-ASCII码 数字转字母
var index=1; var byt = new byte[1] {(byte) (index + 64)}; var grade = Encoding.ASCII.GetString(byt); ...
- 网易测试分享会——“一起打造你想要的QA团队”
昨天(2016.11.30)参加了网易资深测试专家王晓明的测试分享会——“一起打造你想要的QA团队”,以下为笔者做的归纳总结. 重点 1.让测试更加容易做好.不容易测试的代码,不具有健壮性. 2.Ke ...