系统环境:
1.无线通讯模块(硬件设备),接在串口上
2.windows xp系统(两台)两个无线通讯模块分别接在两台电脑上(串口),这里要说明的是无线通讯模块相当于链路层
因为通讯只能在串口上进行,而且需要校验,纠错等传输控制的机制,所以我打算采用ppp通讯各位高人有什么看法,不妨说说小弟没有写过ppp方面的东东,给点说明或者是代码,谢谢啦分数不够另开贴给·!!!
myemail:[email protected]
1.无线通讯模块(硬件设备),接在串口上
2.windows xp系统(两台)两个无线通讯模块分别接在两台电脑上(串口),这里要说明的是无线通讯模块相当于链路层
因为通讯只能在串口上进行,而且需要校验,纠错等传输控制的机制,所以我打算采用ppp通讯各位高人有什么看法,不妨说说小弟没有写过ppp方面的东东,给点说明或者是代码,谢谢啦分数不够另开贴给·!!!
myemail:[email protected]
要通过程序实现,是读写串口(com1口)
所以打算采用ppp读写串口,类似于modem的通讯方式
最好有点实例
我是想问关于ppp协议的编程方法!!
即使实现了ppp之后还后很多事情要做的
使用RAS拨号控制就是PPP协议方式
ppp是点到点的通讯协议,你的硬件(无线通讯模块)必须保证这一点,就是这个机器的串口发送的数据一定要传送到另外一个串口去,反之亦然。
使用PPP通信,应该没有必要编程,你在一台机器上设置成拨号网络服务器,另一台设置成拨号网络客户端。接通后使用SOcket通信就可以了。
哪位朋友可以指教一二。
我正在做相关的项目,到可帮帮你!
你有两个无线通讯模块,可用API函数或MSComm控件做。
APi函数如下做接受:
(初始化)int TeleCom::InitComm(int Comm_num, int baud)
{
/*
if(NULL != m_hComm)
CloseHandle(m_hComm);*/
(接受数据)
if (!WriteFile(m_hComm, lpBuf, dwToWrite, &dwWritten, &osWrite))
{
if (GetLastError() != ERROR_IO_PENDING)
{
// WriteFile failed, but it isn't delayed. Report error and abort.
fRes = FALSE;
//MessageBox("fail1");
}
else
{
// Write is pending.
if (!GetOverlappedResult(m_hComm, &osWrite, &dwWritten, TRUE))
{
fRes = FALSE;
//MessageBox("fail2");
}
else
{ // Write operation completed successfully.
fRes = TRUE;
}
}
}也可用VC内嵌的空间:
(初始化)
if(m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(FALSE);
//参数设置
m_ctrlComm.SetCommPort(1);
//选择COM1
m_ctrlComm.SetOutBufferSize(1024);
//发送缓冲区
m_ctrlComm.SetInputMode(1);
//以二进制方式读写数据
m_ctrlComm.SetSettings("19200,n,8,1");
//波特率9600无检验位,8个数据位,1个停止位
//打开端口
if( !m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(TRUE);//打开串口
else
AfxMessageBox("cannot open serial port");
(发送)
m_ctrlComm.SetOutput(COleVariant(charsend0));
关键是你得把其中之一配成拨号服务器 另一个拨上来以后为其分配ip 然后就是socket通信了
我这就有一个联通内部的拨号服务器 号码就是130xxxxxxxx
PPP有四种格式的首部,分别用于不同的目的。
1、 标准格式:
PPP的标准格式为四个字节:
------------------------------------------------
| 0 | 1 | 2 3 |
------------------------------------------------
| Address | Control | Protocol |
------------------------------------------------
Address =0xff
Control = 0x03
Protocol=0xc021 / 0x8021 / 0xc223 / 0xc023 / 0x0021 / 0x002d / 0x002f / 0x8207
其中Address和Control各占一个字节,Protocol占两个字节,该格式的PPP首部可用于LCP、NCP及认证的协商和传输IP包,压缩的TCP包及未压缩的TCP包,Protocol字段表示的含义见第二部分:PPP协议字段的取值。
2、 使用PFC(Protocol Fields Compress)的格式:
该格式是使用了协议字段压缩的格式,即把两个字节的协议字段压缩成一个字节,所以整个PPP首部只有三个字节:
------------------------------------------
| 0 | 1 | 2 |
------------------------------------------
| Address | Control | Protocol |
------------------------------------------
0 1 2
Address Control Protocol
Address =0xff
Control = 0x03
Protocol=0x21 / 0x2d / 0x2f
其中Address、Control和Protocol各占一个字节,该格式的PPP首部只用于传输IP包,压缩的TCP包及未压缩的TCP包。
3、 使用ACFC(Address and Control Fields Compress)的格式:
该格式是使用了地址和控制字段压缩的格式,只有协议字段的两个字节:
----------------------
| 0 1 |
----------------------
| Protocol |
----------------------
Protocol
Protocol=0x0021 / 0x002d / 0x002f / 0x8021
该格式的PPP首部可用于传输IP包,压缩的TCP包,未压缩的TCP包和NCP协商报文。
4、 同时使用PFC和ACFC的格式:
该格式是使用了协议字段压缩及地址和控制字段压缩的格式,只有一个字节:
----------------------
| 0 |
----------------------
| Protocol |
----------------------
Protocol=0x21 / 0x2d / 0x2f
Protocol占一个字节,该格式的PPP首部分只用于传输IP包,压缩的TCP包及未压缩的TCP包。
一般用第一种格式就行了.不过你用COM口,速度低,可以考虑用第二中格式,可以增加传输的数据比例.PPP协议看FRC文档资料就行了.里面很详细的!
这些过程看看RFC应该清楚的了
但是如果再Windows环境下编程,我总要通知操作系统掉用ppp的通讯方式吧?我有哪些可以使用的资源(例如:dll,函数)?
windows下哪些机制可以控制ppp的传输,编程的时候如果不激活这种机制就算是ppp的报文都按照规范作了,不还是串口通讯吗?
没有modem的情况下不能使用RAS吧?
A Remote Access Service (RAS) Client Class
http://www.vckbase.com/english/code/network/RasClient.shtml.htm
其他还是vckbase
(1)关于COM口:
http://www.vckbase.com/code/listcode.asp?mclsid=9&sclsid=907
上面的地址下很多!我自己用的是:多线程,多接收模式串口类LsComm;另外一个
" Win32 API 串口控制 MFC 打包类 "和上面的一个意思!都是CSerial的打包类,前一个包的更多!
(2)这是关于RAS的:
http://www.vckbase.com/code/listcode.asp?mclsid=9&sclsid=913
http://www.vckbase.com/english/code/network/RasClient.shtml.htm
的介绍:. The demo project, "RasDemo", sets up a PPP dial-up networking connection with a Dial-Up
Server
十分感谢:)to crazyeagle(疯狂鹰) :
兄弟你那里进展如何了?
不过ras对我的这个工程用处不大,我不需要拨号,也没有modem,我想直接进行ppp通讯
RFC我已经看过了,代码不完整,最重要的是现在不知道在WINDOWS下的实现机制
具体工程的时候总归要环境的吧(VC6.0+WINDOWS)
我现在也正处在查资料当中!!!!
你说的,没错!
我要做的通讯是串口通讯,采用PPP是实现可靠的传输系统环境:
1.无线通讯模块(硬件设备),接在PC机器串口上
2.windows xp系统(两台)串口通讯
两个无线通讯模块分别接在两台电脑上(串口),通讯只能在串口上进行,采用ppp(需要可靠的传输控制)通讯
ppp的通信过程大概是这样的
1.首先(你不用完成PPP的所有的功能(如数据包(帧)的压缩,和很多安全认证方面的功能),明确了你要使用PPP的哪些功能了后,就可以开始编写了.
编写
1)你可以定义两个类1个完成串口的通讯2类完成PPP的协议,PPP类调用串口类进行数据传送,
PPP的详细内容(RFC)
我只说一说可靠的方法
如果你要保证可靠你可以在串口类中进行,当然你的要求是PPP,那么你在串口类的传送中就可以只管传送不管出错没有(串口本生有奇偶效检,你可判断来要求对方重发)我使用的一种最简单的差错控制也旁随流量控制来完成可靠传送,但效率不高(占停方式)(前面的连接,认证完成后)1.你的应用程序要保证给PPP发送的数据是一个长度一般<MTU,那应用程序要分段发送数据,
如果你想应用程序传给PPP的是任意长度,那么分段PPP类中实现,(分段的目的是不要使单个数大长)
2.PPP对分段数据进行PPP头封装。(有效验字段)
3.调用串口类进行发送,
4.等待对方的响应
5.如果10秒没有响应重发当前,如果重发3次放弃。
6.如果对方有响应,(判断是确定响应还是重发响应)
7.如果确定发送下一分段,返之重发当前段,3次放弃
8.当该数据的所有分段都发送完后返回上层.
注:接收方是通过发送方发送数据头的效验字段进行差错效验来判断是发确定响应还是重发响应的。由于串口的双工,通信也是双工.
我建议你把从串口收发数据不要做到PPP一起了,
可以做两个线程,一个串口收发数据拼装成PPP的报文后再交给 PPP线程。
整个工作量有点大哦。
串口读写,用线程。
不过做得不太好,有时会有误码。
继续学习ing!