怎么从接口里获取数据、、
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 继承借口 不就行了??
以上是关于怎么从接口里获取数据、、的主要内容,如果未能解决你的问题,请参考以下文章