怎么从接口里获取数据、、

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么从接口里获取数据、、相关的知识,希望对你有一定的参考价值。

不如考虑联合编程,用别的软件读取,再经matlab处理
Matlab是否支持调用usb接口,就像调用串口一样

方法一:使用
VC++
提供的串行通信控件
MSComm
首先,在对话框中创建通
信控件,若
Control
工具栏中缺少该控件,可通过菜单
Project

> Add to
Project

> Components and Control
插入即可,再将该控件从工具箱中拉
到对话框中。此时,你只需要关心控件提供的对

Windows
通讯驱动程序的

API
函数的接口。
换句话说,
只需要设置和监视
MSComm
控件的属性和事件。


ClassWizard
中为新创建的通信控件定义成员对象(
CMSComm
m_Serial
),通过该对象便可以对串口属性进行设置,
MSComm
控件共有
27
个属性,这里只介绍其中几个常用属性:

CommPort
设置并返回通讯端口号,缺省为
COM1


Settings
以字符串的形式设置并返回波特率、
奇偶校验、
数据位、
停止位。

PortOpen
设置并返回通讯端口的状态,也可以打开和关闭端口。

Input
从接收缓冲区返回和删除字符。

Output
向发送缓冲区写一个字符串。

InputLen
设置每次
Input
读入的字符个数,
缺省值为
0

表明读取接收缓


区中的全部内容。

InBufferCount
返回接收缓冲区中已接收到的字符数,将其置
0
可以清除
接收缓

冲区。

InputMode
定义
Input
属性获取数据的方式(为
0
:文本方式;为
1
:二
进制方式)。

RThreshold


SThreshold
属性,表示在

OnComm
事件发生之前,
接收缓冲区或发送缓冲区中可以接收的字符数。

以下是通过设置控件属性对串口进行初始化的实例:

BOOL CSampleDlg:: PortOpen()

BOOL m_Opened;
……

m_Serial.SetCommPort(2); //
指定串口号

m_Serial.SetSettings(“4800,N,8,1″); //
通信参数设置

m_Serial.SetInBufferSize(1024); //
指定接收缓冲区大小

m_Serial.SetInBufferCount(0); //
清空接收缓冲区

m_Serial.InputMode(1); //
设置数据获取方式

m_Serial.SetInputLen(0); //
设置读取方式

m_Opened=m_Serail.SetPortOpen(1); //
打开指定的串口

return m_Opened;


打开所需串口后,
需要考虑串口通信的时机。
在接收或发送数据过程中,

能需要监视并响应一些事件和错误,
所以事件驱动是处理串行端口交互作用的一
种非常有效的方法。
使用

OnComm
事件和

CommEvent
属性捕捉并检查通
讯事件和错误的值。发生通讯事件或错误时,将触发

OnComm
事件,
CommEvent
属性的值将被改变,应用程序检查

CommEvent
属性值并作出
相应的反应。在程序中用
ClassWizard

CMSComm
控件添加
OnComm

息处理函数:

void CSampleDlg::OnComm()

……

设数据发送时间间隔
TimeCycle
相同的定时器:
SetTimer(1,TimeCycle,NULL)
,进行定时读取或发送。

CSampleView:: OnTimer(UINT nIDEvent)

char InputData[30];
m_Serial.ReadData(InputData,30);
//
数据处理



若对端口数据的响应时间要求较严格,
可采用事件驱动
I/O
读写,
Windows
定义了
9
种串口通信事件,较常用的有:

EV_RXCHAR:
接收到一个字节,并放入输入缓冲区。

EV_TXEMPTY:
输出缓冲区中的最后一个字符发送出去。

EV_RXFLAG:
接收到事件字符
(DCB
结构中
EvtChar
成员
)
,放入输入缓
冲区。

在用
SetCommMask()
指定了有用的事件后,应用程序可调用
WaitCommEvent()
来等待事件的发生。

SetCommMask(hComm,0)
可使
WaitCommEvent()
中止。

方法三

多线程下实现串行通信

方法一,
二适用于单线程通信。
在很多工业控制系统中,
常通过扩展串口连
接多个外设,
各外设发送数据的重复频率不同,
要求后台实时无差错捕捉,
采集,
处理,记录各端口数据,这就需要在自定义的串行通信类中创建端口监视线程,
以便在指定的事件发生时向相关的窗口发送通知消息。

线程的基本概念可详见
VC++
参考书目,
Windows
内部的抢先调度程序在
活动的线程之间分配
CPU
时间,
Win 32
区分两种不同类型的线程,一种是用
户界面线程
UI

User Interface Thread

,
它包含消息循环或消息泵,用于处
理接收到的消息;另一种是工作线程(
Work Thread
),它没有消息循环,用
于执行后台任务。用于监视串口事件的线程即为工作线程。

多线程通信类的编写在端口的配置,
连接部分与单线程通信类相同,
在端口
配置完毕后,
最重要的是根据实际情况,
建立多线程之间的同步对象,
如信号灯,
临界区,事件等,相关细节可参考
VC++
中的同步类。

一切就绪后即可启动工作线程:

CWinThrea *CommThread = AfxBegin
Thread(CommWatchThread, //
线程函数名

(LPVOID) m_pTTYInfo, //
传递的参数

THREAD_PRIORITY_ABOVE_NORMAL, //
设置线程优先级

(UINT) 0, //
最大堆栈大小

(DWORD) Create_SUSPENDED , //
创建标志

(LPSECURITY_ATTRIBUTES) NULL); //
安全性标志

同时,在串口事件监视线程中:

if(WaitCommEvent(pTTYInfo->idComDev,&dwEvtMask,NULL))

if((dwEvtMask & pTTYInfo->dwEvtMask )== pTTYInfo->dwEvtMask)

WaitForSingleObject(pTTYInfo->hPostEvent,0xFFFFFFFF);
ResetEvent(pTTYInfo->hPostEvent); //
置同步事件对象为非信号态

::PostMessage(CSampleView,ID_COM1_DATA,0,0); //
发送通知消息





PostMessage()
向指定窗口的消息队列发送通知消息,相应地,需要在
该窗口建立消息与成员函数间的映射,用
ON_MESSAGE
将消息与成员函数名
关联。

BEGIN_MESSAGE_MAP(CSampleView, CView)
//AFX_MSG_MAP(CSampleView)
ON_MESSAGE(ID_COM1_DATA, OnProcessCom1Data)
ON_MESSAGE(ID_COM2_DATA, OnProcessCom2Data)
…..

//AFX_MSG_MAP
END_MESSAGE_MAP()

然后在各成员函数中完成对各串口数据的接收处理,
但必须保证在下一次监
测到有数据到来之前,
能够完成所有的中间处理工作。
否则将造成数据的捕捉错
误。

多线程的实现可以使得各端口独立,
准确地实现串行通信,
使串口通信具有
更广泛的灵活性与严格性,且充分利用了
CPU
时间。但在具体的实时监控系统
中如何协调多个线程,
线程之间以何种方式实现同步也是在多线程串行通信程序
实现的难点。

一个读串口的函数:

HANDLE m_hIDComDev;

int ReceiveComm(char* RecCommData)

DWORD dRead,dReadNum;

COMSTAT ComStat;

LPDWORD ComError;

char *Data;

ClearCommBreak(m_hIDComDev);

ClearCommError(m_hIDComDev,ComError,&ComStat);

dRead=ReadFile(m_hIDComDev, Data, ComStat.cbInQue,
&dReadNum, NULL); //
接收
200
个字符

//dReadNum
为实际接收字节数

PurgeComm(m_hIDComDev,PURGE_RXCLEAR);//
清空接收缓冲区

for(int i = 0 i < ComStat.cbInQue; i++)

*RecCommData = *Data;

RecCommData++;

Data++;


*RecCommData = ‘
\
0′;

if(dRead)
return 1;
else
return 0;



VC
不是语言
,VC
是编程环境
,C,C++
是编程语言
,VC
中编写
C,C++
是比较方便的
,
较好的环境
.

vc
编程源程序要求用
C++
语言来编写
,
在这裏写一下
C++
语言就可以了吧
!
C++
支持面向对象的程序设计方法
,
并可以使用
MS

MFC,
所开发的软件稳定性好
,
可移植性

,
软件与硬件相互独立
.C++
也是一种混合型的程序设计语言
,
既可以支持传统的面向过程的
程序设计
,
也支持现在的面向对象的程序设计
(
面向对象的方法实现了软件的重用问题
,
加速
了软件的开发过程
),C++
既适合作为系统软件的描述语言也适合应用软件的开发语言
,

C

言比它的错误检查机制更强
,
还提供了相关的检查类
,
以编写模块化程度高
,
可重用性和可维
护性佳更适合於大
,
中型程序的开发
.

百新安阳 董行
参考技术A 调用接口 看要不要参数 然后直接就可以得到数据了 参考技术B 继承借口 不就行了??

以上是关于怎么从接口里获取数据、、的主要内容,如果未能解决你的问题,请参考以下文章

java怎样获取JComboBox的数据

怎么利用kettle从一个接口中获取数据

从数据库里python获取数据存到本地数据库

php怎么从数据库里获取到值在html页面上输出?

安卓用httpurlconnection怎么调用接口地址并获取返回值

vue 2.0+ 怎么写本地接口获取数据