vc 串口通信 发送帧数据

mmway 2012-09-23 09:35:22
帧数据的是这样的:
主机发出的呼叫命令帧之间的发送间隔不能小于100ms,一个命令帧字节间发送间隔不能大于5ms;

字节序号 功能描述
1 255 帧同步头
2 9 帧字节数
3 1-63 从机地址
4 170 功能码,读取从机所有通道状态
5 0-255 系统保留字节以备功能扩展
6 0-255 系统保留字节以备功能扩展
7 0-255 系统保留字节以备功能扩展
8 0-255 系统保留字节以备功能扩展
9 校验码 前面8 个字节的值相加除以256 的余数

怎么以帧的形式发送?我只会发比如“?”这样的一个字符,现在要发一帧一帧的该怎么写??
我是个菜鸟。。。
帮帮忙啊
说得详细些,谢谢了~
...全文
208 点赞 收藏 9
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
mmway 2012-09-24
[Quote=引用 2 楼 的回复:]
// 以帧的形式发送,其实就是一次性把帧中的所有内容写入发送缓冲区。
[/Quote]
我是用控件做的啊,我上次发数据是用这个代码(这个数据是一个字符串)
m_Com.SetOutput(COleVariant(SendText));
现在要发一个数组我不会发啊
我是大菜鸟!!
帮帮我啊
回复
mmway 2012-09-24
[Quote=引用 1 楼 的回复:]
http://download.csdn.net/detail/hdg3707/4159079
这是我编的MDI下的MSCOMM通信例子,再给你个好使的代码:
你对比一下定义及顺序,函数名不一样没关系,因为VC版本不一样,但你能看明白函数含义:
void CMy72V300AView::OnCommMscomm1()
{
VARIANT variant_inp;
COleSafeArr……
[/Quote]
数据要是用10进制该怎么写啊
回复
mmway 2012-09-24
[Quote=引用 1 楼 的回复:]
http://download.csdn.net/detail/hdg3707/4159079
这是我编的MDI下的MSCOMM通信例子,再给你个好使的代码:
你对比一下定义及顺序,函数名不一样没关系,因为VC版本不一样,但你能看明白函数含义:
void CMy72V300AView::OnCommMscomm1()
{
VARIANT variant_inp;
COleSafeArr……
[/Quote]
我现在刚刚看到回复,谢谢你的回答,我先仔细看看,谢谢你
回复
sichuanwww 2012-09-24
理论全都有,关键是试验调试。自己动手,丰衣足食。
回复
// 字节间的超时,可以在串口参数中设置,一般来说,串口没有问题的话,字节间不会有5ms的延时。
// 100ms的话,可以用timer或者Sleep,如果没有要求最小帧间间隔的话,可以连续发送。
回复
// API方式的话,大概有这么几步
CreateFile("COM1", ........); //打开串口
SetCommTimeouts(handle, ....); //设置通讯超时
SetCommState(handle, .....); //设置串口参数,包括波特率、数据位、停止位等
BYTE buf[...]; //发送的内容
DWORD bufLength; //发送的长度
DWORD WrittenLength; // 实际发送的长度
WriteFile(handle, buf, bufLength, &WrittenLength, ....); //数据写入串口缓冲区
回复
hdg3707 2012-09-24
在定时器里执行发送函数,比如100毫秒中断一次,在中断函数时这么写:
UINT_PTR m_TimeHandle;//保存定时器的句柄,放在头文件里
CPP初始函数:
m_TimeHandle=SetTimer(1,100,NULL);//此时执行完后m_TimeHandle=1;
以下是中断数里加的
if(nIDEvent==m_TimeHandle)
{
SendData();//发送数据函数
}
回复
// 以帧的形式发送,其实就是一次性把帧中的所有内容写入发送缓冲区。
回复
hdg3707 2012-09-24
http://download.csdn.net/detail/hdg3707/4159079
这是我编的MDI下的MSCOMM通信例子,再给你个好使的代码:
你对比一下定义及顺序,函数名不一样没关系,因为VC版本不一样,但你能看明白函数含义:
void CMy72V300AView::OnCommMscomm1()
{
VARIANT variant_inp;
COleSafeArray safearray_inp;
long i = 0,len;
switch (m_Comm1.get_CommEvent())
{
case 2:
//表示接收缓冲区内有字符
{

variant_inp = m_Comm1.get_Input();
safearray_inp = variant_inp;
len = safearray_inp.GetOneDimSize();
for (i = 0; i < len; i++)
{
safearray_inp.GetElement(&i, &m_ReceBuff[i]);
}
m_Comm1.put_OutBufferCount(0);// '清空发送缓冲区
m_Comm1.put_InBufferCount(0);// '滑空接收缓冲区
safearray_inp.Clear();
}
break;
default:
break;
}
}
串口初始化:
view1->m_Comm1.put_CommPort(1); //串口1
view1->m_Comm1.put_InBufferSize(4096); //设置输入缓冲区的大小,Bytes
view1->m_Comm1.put_OutBufferSize(2048); //设置输入缓冲区的大小,Bytes
if(!view1->m_Comm1.get_PortOpen()) //打开串口
{
view1->m_Comm1.put_PortOpen(true);
}
view1->m_Comm1.put_OutBufferCount(0);// '清空发送缓冲区
view1->m_Comm1.put_InBufferCount(0);// '滑空接收缓冲区

view1->m_Comm1.put_InputMode(1); //设置输入方式为二进制方式
view1->m_Comm1.put_Settings(str); //设置波特率等参数
view1->m_Comm1.put_RThreshold(8); //为8表示有8个字符即引发事件
view1->m_Comm1.put_InputLen(0);
这是发送函数:
int i,Count;
BYTE SendBuff[8];
CByteArray Array;
Count=8;
Array.RemoveAll();
Array.SetSize(Count);

SendBuff[0]=0;
SendBuff[1]=0;
SendBuff[2]=0;
SendBuff[3]=0;
SendBuff[4]=0x55;
SendBuff[5]=0xaa;
SendBuff[6]=0x55;
SendBuff[7]=0xaa;
for(i=0;i<Count;i++)
Array.SetAt(i,SendBuff[i]);
m_CurrentCommandId=2;
m_Comm1.put_OutBufferCount(0);
// m_Comm1.put_InBufferCount(0);

m_Comm1.put_Output(COleVariant(Array));
发送函数里改成你的数据就行了,记住数据大小改成你要发送数据的大小,数据值可以赋给16进制,也可以赋给十进制,都是一样的,我习惯赋16进制的值
回复
发帖
ATL
创建于2007-09-28

3214

社区成员

ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
申请成为版主
帖子事件
创建了帖子
2012-09-23 09:35
社区公告
暂无公告