全面升级数据传输接口,使用安全的字节数据来传递数据。
回调函数中增加额外的参数,用于传递会话参数,比如UDP中的远程地址
This commit is contained in:
parent
129f084572
commit
f11eb549c6
|
@ -704,8 +704,9 @@ byte Enc28j60::GetRevision()
|
||||||
return ReadReg(EREVID);
|
return ReadReg(EREVID);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Enc28j60::OnWrite(const byte* packet, uint len)
|
bool Enc28j60::OnWrite(const ByteArray& bs)
|
||||||
{
|
{
|
||||||
|
uint len = bs.Length();
|
||||||
assert_param2(len <= MAX_FRAMELEN, "以太网数据帧超大");
|
assert_param2(len <= MAX_FRAMELEN, "以太网数据帧超大");
|
||||||
|
|
||||||
if(!Linked())
|
if(!Linked())
|
||||||
|
@ -735,7 +736,7 @@ bool Enc28j60::OnWrite(const byte* packet, uint len)
|
||||||
WriteOp(ENC28J60_WRITE_BUF_MEM, 0, 0x00);
|
WriteOp(ENC28J60_WRITE_BUF_MEM, 0, 0x00);
|
||||||
|
|
||||||
// 复制数据包到传输缓冲区
|
// 复制数据包到传输缓冲区
|
||||||
WriteBuffer(packet, len);
|
WriteBuffer(bs.GetBuffer(), len);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
仅发送复位通过SPI接口向ECON1寄存器的 TXRST 位写入1可实现仅发送复位。
|
仅发送复位通过SPI接口向ECON1寄存器的 TXRST 位写入1可实现仅发送复位。
|
||||||
|
@ -804,6 +805,7 @@ bool Enc28j60::OnWrite(const byte* packet, uint len)
|
||||||
ReadBuffer((byte*)&TXStatus, sizeof(TXStatus));
|
ReadBuffer((byte*)&TXStatus, sizeof(TXStatus));
|
||||||
|
|
||||||
#if NET_DEBUG
|
#if NET_DEBUG
|
||||||
|
byte* packet = bs.GetBuffer();
|
||||||
MacAddress dest = packet;
|
MacAddress dest = packet;
|
||||||
MacAddress src = packet + 6;
|
MacAddress src = packet + 6;
|
||||||
dest.Show();
|
dest.Show();
|
||||||
|
@ -925,7 +927,7 @@ bool Enc28j60::OnWrite(const byte* packet, uint len)
|
||||||
|
|
||||||
// 从网络接收缓冲区获取一个数据包,该包开头是以太网头
|
// 从网络接收缓冲区获取一个数据包,该包开头是以太网头
|
||||||
// packet,该包应该存储到的缓冲区;maxlen,可接受的最大数据长度
|
// packet,该包应该存储到的缓冲区;maxlen,可接受的最大数据长度
|
||||||
uint Enc28j60::OnRead(byte* packet, uint maxlen)
|
uint Enc28j60::OnRead(ByteArray& bs)
|
||||||
{
|
{
|
||||||
uint rxstat;
|
uint rxstat;
|
||||||
uint len;
|
uint len;
|
||||||
|
@ -965,7 +967,7 @@ uint Enc28j60::OnRead(byte* packet, uint maxlen)
|
||||||
rxstat = ReadOp(ENC28J60_READ_BUF_MEM, 0);
|
rxstat = ReadOp(ENC28J60_READ_BUF_MEM, 0);
|
||||||
rxstat |= ReadOp(ENC28J60_READ_BUF_MEM, 0) << 8;
|
rxstat |= ReadOp(ENC28J60_READ_BUF_MEM, 0) << 8;
|
||||||
// 限制获取的长度。有些例程这里不用减一
|
// 限制获取的长度。有些例程这里不用减一
|
||||||
if (len > maxlen - 1) len = maxlen - 1;
|
if (len > bs.Length() - 1) len = bs.Length() - 1;
|
||||||
|
|
||||||
// 检查CRC和符号错误
|
// 检查CRC和符号错误
|
||||||
// ERXFCON.CRCEN是默认设置。通常我们不需要检查
|
// ERXFCON.CRCEN是默认设置。通常我们不需要检查
|
||||||
|
@ -977,8 +979,9 @@ uint Enc28j60::OnRead(byte* packet, uint maxlen)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// 从缓冲区中将数据包复制到packet中
|
// 从缓冲区中将数据包复制到packet中
|
||||||
ReadBuffer(packet, len);
|
ReadBuffer(bs.GetBuffer(), len);
|
||||||
}
|
}
|
||||||
|
bs.SetLength(len);
|
||||||
// 移动接收缓冲区 读指针
|
// 移动接收缓冲区 读指针
|
||||||
WriteReg(ERXRDPTL, (NextPacketPtr));
|
WriteReg(ERXRDPTL, (NextPacketPtr));
|
||||||
WriteReg(ERXRDPTH, (NextPacketPtr) >> 8);
|
WriteReg(ERXRDPTH, (NextPacketPtr) >> 8);
|
||||||
|
|
|
@ -58,8 +58,8 @@ protected:
|
||||||
virtual bool OnOpen();
|
virtual bool OnOpen();
|
||||||
virtual void OnClose() { }
|
virtual void OnClose() { }
|
||||||
|
|
||||||
virtual bool OnWrite(const byte* buf, uint len);
|
virtual bool OnWrite(const ByteArray& bs);
|
||||||
virtual uint OnRead(byte* buf, uint len);
|
virtual uint OnRead(ByteArray& bs);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -834,7 +834,7 @@ void NRF24L01::OnClose()
|
||||||
}
|
}
|
||||||
|
|
||||||
// 从NRF的接收缓冲区中读出数据
|
// 从NRF的接收缓冲区中读出数据
|
||||||
uint NRF24L01::OnRead(byte *data, uint len)
|
uint NRF24L01::OnRead(ByteArray& bs)
|
||||||
{
|
{
|
||||||
// 亮灯。离开时自动熄灯
|
// 亮灯。离开时自动熄灯
|
||||||
//PortScope ps(LedRx);
|
//PortScope ps(LedRx);
|
||||||
|
@ -871,12 +871,13 @@ uint NRF24L01::OnRead(byte *data, uint len)
|
||||||
else
|
else
|
||||||
rs = ReadReg(RX_PL_WID);
|
rs = ReadReg(RX_PL_WID);
|
||||||
|
|
||||||
|
uint len = bs.Capacity();
|
||||||
if(rs > len)
|
if(rs > len)
|
||||||
{
|
{
|
||||||
debug_printf("NRF24L01::Read 实际负载%d,缓冲区大小%d,为了稳定,使用缓冲区大小\r\n", rs, len);
|
debug_printf("NRF24L01::Read 实际负载%d,缓冲区大小%d,为了稳定,使用缓冲区大小\r\n", rs, len);
|
||||||
rs = len;
|
rs = len;
|
||||||
}
|
}
|
||||||
ReadBuf(RD_RX_PLOAD, data, rs); // 读取数据
|
ReadBuf(RD_RX_PLOAD, bs.GetBuffer(), rs); // 读取数据
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -890,11 +891,13 @@ uint NRF24L01::OnRead(byte *data, uint len)
|
||||||
//_CE = true;
|
//_CE = true;
|
||||||
if(rs && LedRx) *LedRx = !*LedRx;
|
if(rs && LedRx) *LedRx = !*LedRx;
|
||||||
|
|
||||||
|
bs.SetLength(rs);
|
||||||
|
|
||||||
return rs;
|
return rs;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 向NRF的发送缓冲区中写入数据
|
// 向NRF的发送缓冲区中写入数据
|
||||||
bool NRF24L01::OnWrite(const byte* data, uint len)
|
bool NRF24L01::OnWrite(const ByteArray& bs)
|
||||||
{
|
{
|
||||||
// 亮灯。离开时自动熄灯
|
// 亮灯。离开时自动熄灯
|
||||||
//PortScope ps(LedTx);
|
//PortScope ps(LedTx);
|
||||||
|
@ -923,9 +926,10 @@ bool NRF24L01::OnWrite(const byte* data, uint len)
|
||||||
|
|
||||||
byte cmd = AutoAnswer ? WR_TX_PLOAD : TX_NOACK;
|
byte cmd = AutoAnswer ? WR_TX_PLOAD : TX_NOACK;
|
||||||
// 检查要发送数据的长度
|
// 检查要发送数据的长度
|
||||||
|
uint len = bs.Length();
|
||||||
assert_param(PayloadWidth == 0 || len <= PayloadWidth);
|
assert_param(PayloadWidth == 0 || len <= PayloadWidth);
|
||||||
if(PayloadWidth > 0) len = PayloadWidth;
|
if(PayloadWidth > 0) len = PayloadWidth;
|
||||||
WriteBuf(cmd, data, len);
|
WriteBuf(cmd, bs.GetBuffer(), len);
|
||||||
|
|
||||||
// 进入TX,维持一段时间
|
// 进入TX,维持一段时间
|
||||||
_CE = true;
|
_CE = true;
|
||||||
|
@ -1042,15 +1046,20 @@ void NRF24L01::OnIRQ()
|
||||||
|
|
||||||
if(st.RX_DR)
|
if(st.RX_DR)
|
||||||
{
|
{
|
||||||
byte buf[64];
|
ByteArray bs;
|
||||||
uint len = Read(buf, ArrayLength(buf));
|
uint len = Read(bs);
|
||||||
//ClearStatus(false, true);
|
//ClearStatus(false, true);
|
||||||
if(len)
|
if(len)
|
||||||
{
|
{
|
||||||
len = OnReceive(buf, len);
|
uint addr = st.RX_P_NO;
|
||||||
|
len = OnReceive(bs, (void*)addr);
|
||||||
|
|
||||||
// 如果有返回,说明有数据要回复出去
|
// 如果有返回,说明有数据要回复出去
|
||||||
if(len) Write(buf, len);
|
if(len)
|
||||||
|
{
|
||||||
|
bs.SetLength(len, true);
|
||||||
|
Write(bs);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,21 +1,12 @@
|
||||||
#include "ShunCom.h"
|
#include "ShunCom.h"
|
||||||
|
|
||||||
ShunCom::ShunCom()
|
ShunCom::ShunCom() { }
|
||||||
{
|
|
||||||
Port = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ShunCom::~ShunCom()
|
|
||||||
{
|
|
||||||
delete Port;
|
|
||||||
Port = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ShunCom::Init(ITransport* port, Pin rst)
|
void ShunCom::Init(ITransport* port, Pin rst)
|
||||||
{
|
{
|
||||||
assert_ptr(port);
|
assert_ptr(port);
|
||||||
|
|
||||||
Port = port;
|
Set(port);
|
||||||
|
|
||||||
if(rst != P0) Reset.Set(rst);
|
if(rst != P0) Reset.Set(rst);
|
||||||
}
|
}
|
||||||
|
@ -37,7 +28,7 @@ bool ShunCom::OnOpen()
|
||||||
Sys.Delay(100);
|
Sys.Delay(100);
|
||||||
Reset = true;
|
Reset = true;
|
||||||
|
|
||||||
return Port->Open();
|
return PackPort::OnOpen();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShunCom::OnClose()
|
void ShunCom::OnClose()
|
||||||
|
@ -48,27 +39,5 @@ void ShunCom::OnClose()
|
||||||
|
|
||||||
Reset.Close();
|
Reset.Close();
|
||||||
|
|
||||||
Port->Close();
|
PackPort::OnClose();
|
||||||
}
|
|
||||||
|
|
||||||
bool ShunCom::OnWrite(const byte* buf, uint len) { return Port->Write(buf, len); }
|
|
||||||
uint ShunCom::OnRead(byte* buf, uint len) { return Port->Read(buf, len); }
|
|
||||||
|
|
||||||
// 注册回调函数
|
|
||||||
void ShunCom::Register(TransportHandler handler, void* param)
|
|
||||||
{
|
|
||||||
ITransport::Register(handler, param);
|
|
||||||
|
|
||||||
if(handler)
|
|
||||||
Port->Register(OnPortReceive, this);
|
|
||||||
else
|
|
||||||
Port->Register(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint ShunCom::OnPortReceive(ITransport* sender, byte* buf, uint len, void* param)
|
|
||||||
{
|
|
||||||
assert_ptr(param);
|
|
||||||
|
|
||||||
ShunCom* zb = (ShunCom*)param;
|
|
||||||
return zb->OnReceive(buf, len);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,12 +7,11 @@
|
||||||
|
|
||||||
// 上海顺舟Zigbee协议
|
// 上海顺舟Zigbee协议
|
||||||
// 主站发送所有从站收到,从站发送只有主站收到
|
// 主站发送所有从站收到,从站发送只有主站收到
|
||||||
class ShunCom : public ITransport
|
class ShunCom : public PackPort
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ITransport* Port; // 传输口
|
|
||||||
OutputPort Reset; // 复位
|
OutputPort Reset; // 复位
|
||||||
|
|
||||||
OutputPort Power; // 电源
|
OutputPort Power; // 电源
|
||||||
|
@ -24,23 +23,14 @@ public:
|
||||||
InputPort Alarm; // 警告错误
|
InputPort Alarm; // 警告错误
|
||||||
|
|
||||||
ShunCom();
|
ShunCom();
|
||||||
virtual ~ShunCom();
|
|
||||||
|
|
||||||
void Init(ITransport* port, Pin rst = P0);
|
void Init(ITransport* port, Pin rst = P0);
|
||||||
|
|
||||||
// 注册回调函数
|
|
||||||
virtual void Register(TransportHandler handler, void* param = NULL);
|
|
||||||
|
|
||||||
virtual string ToString() { return "ShunCom"; }
|
virtual string ToString() { return "ShunCom"; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual bool OnOpen();
|
virtual bool OnOpen();
|
||||||
virtual void OnClose();
|
virtual void OnClose();
|
||||||
|
|
||||||
virtual bool OnWrite(const byte* buf, uint len);
|
|
||||||
virtual uint OnRead(byte* buf, uint len);
|
|
||||||
|
|
||||||
static uint OnPortReceive(ITransport* sender, byte* buf, uint len, void* param);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1077,17 +1077,13 @@ bool HardSocket::Send(const ByteArray& bs)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool HardSocket::OnWrite(const byte* buf, uint len)
|
bool HardSocket::OnWrite(const ByteArray& bs)
|
||||||
{
|
{
|
||||||
ByteArray bs(buf,len);
|
|
||||||
return Send(bs);
|
return Send(bs);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint HardSocket::OnRead(byte* buf, uint len)
|
uint HardSocket::OnRead(ByteArray& bs)
|
||||||
{
|
{
|
||||||
ByteArray bs(buf, len);
|
|
||||||
|
|
||||||
// 不容 ByteArray 偷梁换柱把buf换掉
|
|
||||||
return Receive(bs);
|
return Receive(bs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1286,7 +1282,7 @@ void TcpClient::RaiseReceive()
|
||||||
if(size > 1500)return;
|
if(size > 1500)return;
|
||||||
|
|
||||||
// 回调中断
|
// 回调中断
|
||||||
OnReceive(bs.GetBuffer(), size);
|
OnReceive(bs, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************** UdpClient ************************************/
|
/****************************** UdpClient ************************************/
|
||||||
|
@ -1352,6 +1348,7 @@ void UdpClient::RaiseReceive()
|
||||||
IPEndPoint ep(bs2);
|
IPEndPoint ep(bs2);
|
||||||
ep.Port = __REV16(ep.Port);
|
ep.Port = __REV16(ep.Port);
|
||||||
// 回调中断
|
// 回调中断
|
||||||
OnReceive(ms.ReadBytes(len), len);
|
ByteArray bs3(ms.ReadBytes(len), len);
|
||||||
|
OnReceive(bs3, NULL);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -117,8 +117,8 @@ public:
|
||||||
virtual bool OnOpen();
|
virtual bool OnOpen();
|
||||||
virtual void OnClose();
|
virtual void OnClose();
|
||||||
|
|
||||||
virtual bool OnWrite(const byte* buf, uint len);
|
virtual bool OnWrite(const ByteArray& bs);
|
||||||
virtual uint OnRead(byte* buf, uint len);
|
virtual uint OnRead(ByteArray& bs);
|
||||||
|
|
||||||
// 发送数据
|
// 发送数据
|
||||||
virtual bool Send(const ByteArray& bs);
|
virtual bool Send(const ByteArray& bs);
|
||||||
|
|
|
@ -78,8 +78,8 @@ protected:
|
||||||
virtual bool OnOpen();
|
virtual bool OnOpen();
|
||||||
virtual void OnClose();
|
virtual void OnClose();
|
||||||
|
|
||||||
virtual bool OnWrite(const byte* buf, uint len);
|
virtual bool OnWrite(const ByteArray& bs);
|
||||||
virtual uint OnRead(byte* buf, uint len);
|
virtual uint OnRead(ByteArray& bs);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -50,8 +50,11 @@ void Controller::Close()
|
||||||
Opened = false;
|
Opened = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint Controller::Dispatch(ITransport* port, byte* buf, uint len, void* param)
|
uint Controller::Dispatch(ITransport* port, ByteArray& bs, void* param, void* param2)
|
||||||
{
|
{
|
||||||
|
byte* buf = bs.GetBuffer();
|
||||||
|
uint len = bs.Length();
|
||||||
|
|
||||||
assert_ptr(buf);
|
assert_ptr(buf);
|
||||||
assert_ptr(param);
|
assert_ptr(param);
|
||||||
|
|
||||||
|
@ -137,11 +140,12 @@ bool Controller::Send(Message& msg)
|
||||||
// 带有负载数据,需要合并成为一段连续的内存
|
// 带有负载数据,需要合并成为一段连续的内存
|
||||||
msg.Write(ms);
|
msg.Write(ms);
|
||||||
//assert_param2(len == ms.Position(), "消息标称大小和实际大小不符");
|
//assert_param2(len == ms.Position(), "消息标称大小和实际大小不符");
|
||||||
uint len = ms.Position();
|
/*uint len = ms.Position();
|
||||||
// 内存流扩容以后,指针会改变
|
// 内存流扩容以后,指针会改变
|
||||||
byte* p = ms.GetBuffer();
|
byte* p = ms.GetBuffer();*/
|
||||||
|
|
||||||
return Port->Write(p, len);
|
ByteArray bs(ms.GetBuffer(), ms.Position());
|
||||||
|
return Port->Write(bs);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Controller::Reply(Message& msg)
|
bool Controller::Reply(Message& msg)
|
||||||
|
|
|
@ -14,7 +14,7 @@ typedef bool (*MessageHandler)(Message& msg, void* param);
|
||||||
class Controller
|
class Controller
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
static uint Dispatch(ITransport* port, byte* buf, uint len, void* param);
|
static uint Dispatch(ITransport* port, ByteArray& bs, void* param, void* param2);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
|
|
@ -193,9 +193,8 @@ void Dhcp::PareOption(Stream& ms)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint Dhcp::OnReceive(ITransport* port, byte* buf, uint len, void* param)
|
uint Dhcp::OnReceive(ITransport* port, ByteArray& bs, void* param, void* param2)
|
||||||
{
|
{
|
||||||
ByteArray bs(buf, len);
|
|
||||||
((Dhcp*)param)->Process(bs);
|
((Dhcp*)param)->Process(bs);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -35,7 +35,7 @@ public:
|
||||||
EventHandler OnStop;
|
EventHandler OnStop;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static uint OnReceive(ITransport* port, byte* buf, uint len, void* param);
|
static uint OnReceive(ITransport* port, ByteArray& bs, void* param, void* param2);
|
||||||
void Process(ByteArray& bs);
|
void Process(ByteArray& bs);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
class ITransport;
|
class ITransport;
|
||||||
|
|
||||||
// 传输口数据到达委托。传入数据缓冲区地址和长度,如有反馈,仍使用该缓冲区,返回数据长度
|
// 传输口数据到达委托。传入数据缓冲区地址和长度,如有反馈,仍使用该缓冲区,返回数据长度
|
||||||
typedef uint (*TransportHandler)(ITransport* transport, byte* buf, uint len, void* param);
|
typedef uint (*TransportHandler)(ITransport* port, ByteArray& bs, void* param, void* param2);
|
||||||
|
|
||||||
// 帧数据传输接口
|
// 帧数据传输接口
|
||||||
// 实现者确保数据以包的形式传输,屏蔽数据的粘包和拆包
|
// 实现者确保数据以包的形式传输,屏蔽数据的粘包和拆包
|
||||||
|
@ -66,17 +66,6 @@ public:
|
||||||
Opened = false;
|
Opened = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送数据
|
|
||||||
bool Write(const byte* buf, uint len)
|
|
||||||
{
|
|
||||||
// 特别是接口要检查this指针
|
|
||||||
assert_ptr(this);
|
|
||||||
|
|
||||||
if(!Opened && !Open()) return false;
|
|
||||||
|
|
||||||
return OnWrite(buf, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 发送数据
|
// 发送数据
|
||||||
bool Write(const ByteArray& bs)
|
bool Write(const ByteArray& bs)
|
||||||
{
|
{
|
||||||
|
@ -85,18 +74,7 @@ public:
|
||||||
|
|
||||||
if(!Opened && !Open()) return false;
|
if(!Opened && !Open()) return false;
|
||||||
|
|
||||||
return OnWrite(bs.GetBuffer(), bs.Length());
|
return OnWrite(bs);
|
||||||
}
|
|
||||||
|
|
||||||
// 接收数据
|
|
||||||
uint Read(byte* buf, uint len)
|
|
||||||
{
|
|
||||||
// 特别是接口要检查this指针
|
|
||||||
assert_ptr(this);
|
|
||||||
|
|
||||||
if(!Opened && !Open()) return 0;
|
|
||||||
|
|
||||||
return OnRead(buf, len);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 接收数据
|
// 接收数据
|
||||||
|
@ -107,7 +85,7 @@ public:
|
||||||
|
|
||||||
if(!Opened && !Open()) return 0;
|
if(!Opened && !Open()) return 0;
|
||||||
|
|
||||||
return OnRead(bs.GetBuffer(), bs.Length());
|
return OnRead(bs);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 注册回调函数
|
// 注册回调函数
|
||||||
|
@ -116,18 +94,8 @@ public:
|
||||||
// 特别是接口要检查this指针
|
// 特别是接口要检查this指针
|
||||||
assert_ptr(this);
|
assert_ptr(this);
|
||||||
|
|
||||||
if(handler)
|
_handler = handler;
|
||||||
{
|
_param = param;
|
||||||
_handler = handler;
|
|
||||||
_param = param;
|
|
||||||
|
|
||||||
//if(!Opened) Open();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_handler = NULL;
|
|
||||||
_param = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
|
@ -139,19 +107,62 @@ public:
|
||||||
protected:
|
protected:
|
||||||
virtual bool OnOpen() { return true; }
|
virtual bool OnOpen() { return true; }
|
||||||
virtual void OnClose() { }
|
virtual void OnClose() { }
|
||||||
virtual bool OnWrite(const byte* buf, uint len) = 0;
|
virtual bool OnWrite(const ByteArray& bs) = 0;
|
||||||
virtual uint OnRead(byte* buf, uint len) = 0;
|
virtual uint OnRead(ByteArray& bs) = 0;
|
||||||
|
|
||||||
// 是否有回调函数
|
// 是否有回调函数
|
||||||
bool HasHandler() { return _handler != NULL; }
|
bool HasHandler() { return _handler != NULL; }
|
||||||
|
|
||||||
// 引发数据到达事件
|
// 引发数据到达事件
|
||||||
virtual uint OnReceive(byte* buf, uint len)
|
virtual uint OnReceive(ByteArray& bs, void* param)
|
||||||
{
|
{
|
||||||
if(_handler) return _handler(this, buf, len, _param);
|
if(_handler) return _handler(this, bs, _param, param);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 数据口包装
|
||||||
|
class PackPort : public ITransport
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
//ITransport* _port;
|
||||||
|
|
||||||
|
public:
|
||||||
|
ITransport* Port; // 传输口
|
||||||
|
|
||||||
|
virtual ~PackPort()
|
||||||
|
{
|
||||||
|
if(Port) Port->Register(NULL);
|
||||||
|
delete Port;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void Set(ITransport* port)
|
||||||
|
{
|
||||||
|
if(Port) Port->Register(NULL);
|
||||||
|
|
||||||
|
Port = port;
|
||||||
|
|
||||||
|
if(Port) Port->Register(OnPortReceive, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual string ToString() { return "PackPort"; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual bool OnOpen() { return Port->Open(); }
|
||||||
|
virtual void OnClose() { Port->Close(); }
|
||||||
|
|
||||||
|
virtual bool OnWrite(const ByteArray& bs) { return Port->Write(bs); }
|
||||||
|
virtual uint OnRead(ByteArray& bs) { return Port->Read(bs); }
|
||||||
|
|
||||||
|
static uint OnPortReceive(ITransport* sender, ByteArray& bs, void* param, void* param2)
|
||||||
|
{
|
||||||
|
assert_ptr(param);
|
||||||
|
|
||||||
|
//PackPort* pp = (PackPort*)param;
|
||||||
|
PackPort* pp = dynamic_cast<PackPort*>((PackPort*)param);
|
||||||
|
return pp->OnReceive(bs, param2);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,34 +1,20 @@
|
||||||
#include "Zigbee.h"
|
#include "Zigbee.h"
|
||||||
|
|
||||||
Zigbee::Zigbee()
|
Zigbee::Zigbee() { }
|
||||||
{
|
|
||||||
_port = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
Zigbee::Zigbee(ITransport* port, Pin rst)
|
Zigbee::Zigbee(ITransport* port, Pin rst)
|
||||||
{
|
{
|
||||||
Init(port);
|
Init(port);
|
||||||
}
|
}
|
||||||
|
|
||||||
Zigbee::~Zigbee()
|
|
||||||
{
|
|
||||||
delete _port;
|
|
||||||
_port = NULL;
|
|
||||||
|
|
||||||
/*if(_rst) delete _rst;
|
|
||||||
_rst = NULL;*/
|
|
||||||
}
|
|
||||||
|
|
||||||
void Zigbee::Init(ITransport* port, Pin rst)
|
void Zigbee::Init(ITransport* port, Pin rst)
|
||||||
{
|
{
|
||||||
assert_ptr(port);
|
assert_ptr(port);
|
||||||
|
|
||||||
_port = port;
|
Set(port);
|
||||||
|
|
||||||
//_rst = NULL;
|
|
||||||
if(rst != P0)
|
if(rst != P0)
|
||||||
{
|
{
|
||||||
//_rst = new OutputPort(rst);
|
|
||||||
_rst.Set(rst).Open();
|
_rst.Set(rst).Open();
|
||||||
Reset();
|
Reset();
|
||||||
}
|
}
|
||||||
|
@ -44,22 +30,3 @@ void Zigbee::Reset(void)
|
||||||
Sys.Delay(100);
|
Sys.Delay(100);
|
||||||
_rst = true;
|
_rst = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 注册回调函数
|
|
||||||
void Zigbee::Register(TransportHandler handler, void* param)
|
|
||||||
{
|
|
||||||
ITransport::Register(handler, param);
|
|
||||||
|
|
||||||
if(handler)
|
|
||||||
_port->Register(OnPortReceive, this);
|
|
||||||
else
|
|
||||||
_port->Register(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint Zigbee::OnPortReceive(ITransport* sender, byte* buf, uint len, void* param)
|
|
||||||
{
|
|
||||||
assert_ptr(param);
|
|
||||||
|
|
||||||
Zigbee* zb = (Zigbee*)param;
|
|
||||||
return zb->OnReceive(buf, len);
|
|
||||||
}
|
|
||||||
|
|
16
Net/Zigbee.h
16
Net/Zigbee.h
|
@ -7,33 +7,19 @@
|
||||||
|
|
||||||
// Zigbee协议
|
// Zigbee协议
|
||||||
// 主站发送所有从站收到,从站发送只有主站收到
|
// 主站发送所有从站收到,从站发送只有主站收到
|
||||||
class Zigbee : public ITransport
|
class Zigbee : public PackPort
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
ITransport* _port;
|
|
||||||
OutputPort _rst;
|
OutputPort _rst;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Zigbee();
|
Zigbee();
|
||||||
Zigbee(ITransport* port, Pin rst = P0);
|
Zigbee(ITransport* port, Pin rst = P0);
|
||||||
virtual ~Zigbee();
|
|
||||||
void Init(ITransport* port, Pin rst = P0);
|
void Init(ITransport* port, Pin rst = P0);
|
||||||
|
|
||||||
// 注册回调函数
|
|
||||||
virtual void Register(TransportHandler handler, void* param = NULL);
|
|
||||||
|
|
||||||
virtual void Reset(void);
|
virtual void Reset(void);
|
||||||
|
|
||||||
virtual string ToString() { return "Zigbee"; }
|
virtual string ToString() { return "Zigbee"; }
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual bool OnOpen() { return _port->Open(); }
|
|
||||||
virtual void OnClose() { _port->Close(); }
|
|
||||||
|
|
||||||
virtual bool OnWrite(const byte* buf, uint len) { return _port->Write(buf, len); }
|
|
||||||
virtual uint OnRead(byte* buf, uint len) { return _port->Read(buf, len); }
|
|
||||||
|
|
||||||
static uint OnPortReceive(ITransport* sender, byte* buf, uint len, void* param);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
21
Queue.cpp
21
Queue.cpp
|
@ -7,13 +7,10 @@ Queue::Queue(uint len)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 使用缓冲区初始化缓冲区。注意,此时指针位于0,而内容长度为缓冲区长度
|
// 使用缓冲区初始化缓冲区。注意,此时指针位于0,而内容长度为缓冲区长度
|
||||||
Queue::Queue(byte* buf, uint len)
|
Queue::Queue(ByteArray& bs)
|
||||||
{
|
{
|
||||||
assert_ptr(buf);
|
_Buffer = bs.GetBuffer();
|
||||||
//assert_param2(len > 0, "不能用0长度缓冲区来初始化缓冲区");
|
_Capacity = bs.Length();
|
||||||
|
|
||||||
_Buffer = buf;
|
|
||||||
_Capacity = len;
|
|
||||||
_size = 0;
|
_size = 0;
|
||||||
_head = 0;
|
_head = 0;
|
||||||
_tail = 0;
|
_tail = 0;
|
||||||
|
@ -96,8 +93,11 @@ byte Queue::Peek() const
|
||||||
return _Buffer[_tail];
|
return _Buffer[_tail];
|
||||||
}
|
}
|
||||||
|
|
||||||
uint Queue::Write(const byte* buf, uint len, bool safe)
|
uint Queue::Write(const ByteArray& bs, bool safe)
|
||||||
{
|
{
|
||||||
|
byte* buf = bs.GetBuffer();
|
||||||
|
uint len = bs.Length();
|
||||||
|
|
||||||
uint rs = 0;
|
uint rs = 0;
|
||||||
while(true)
|
while(true)
|
||||||
{
|
{
|
||||||
|
@ -135,10 +135,13 @@ uint Queue::Write(const byte* buf, uint len, bool safe)
|
||||||
return rs;
|
return rs;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint Queue::Read(byte* buf, uint len, bool safe)
|
uint Queue::Read(ByteArray& bs, bool safe)
|
||||||
{
|
{
|
||||||
if(_size == 0) return 0;
|
if(_size == 0) return 0;
|
||||||
|
|
||||||
|
byte* buf = bs.GetBuffer();
|
||||||
|
uint len = bs.Length();
|
||||||
|
|
||||||
if(len > _size) len = _size;
|
if(len > _size) len = _size;
|
||||||
|
|
||||||
uint rs = 0;
|
uint rs = 0;
|
||||||
|
@ -177,5 +180,7 @@ uint Queue::Read(byte* buf, uint len, bool safe)
|
||||||
if(_size == 0) _tail = _head;
|
if(_size == 0) _tail = _head;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bs.SetLength(rs, true);
|
||||||
|
|
||||||
return rs;
|
return rs;
|
||||||
}
|
}
|
||||||
|
|
6
Queue.h
6
Queue.h
|
@ -24,7 +24,7 @@ public:
|
||||||
// 分配指定大小的缓冲区
|
// 分配指定大小的缓冲区
|
||||||
Queue(uint len = 0);
|
Queue(uint len = 0);
|
||||||
// 使用缓冲区初始化缓冲区。注意,此时指针位于0,而内容长度为缓冲区长度
|
// 使用缓冲区初始化缓冲区。注意,此时指针位于0,而内容长度为缓冲区长度
|
||||||
Queue(byte* buf, uint len);
|
Queue(ByteArray& bs);
|
||||||
// 销毁缓冲区
|
// 销毁缓冲区
|
||||||
~Queue();
|
~Queue();
|
||||||
|
|
||||||
|
@ -41,8 +41,8 @@ public:
|
||||||
byte Pop();
|
byte Pop();
|
||||||
byte Peek() const;
|
byte Peek() const;
|
||||||
|
|
||||||
uint Write(const byte* buf, uint len, bool safe = false); // 批量写入
|
uint Write(const ByteArray& bs, bool safe = false); // 批量写入
|
||||||
uint Read(byte* buf, uint len, bool safe = false); // 批量读取
|
uint Read(ByteArray& bs, bool safe = false); // 批量读取
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -236,24 +236,24 @@ uint SerialPort::SendData(byte data, uint times)
|
||||||
USART_SendData(_port, (ushort)data);
|
USART_SendData(_port, (ushort)data);
|
||||||
else
|
else
|
||||||
Error++;
|
Error++;
|
||||||
|
|
||||||
return times;
|
return times;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 向某个端口写入数据。如果size为0,则把data当作字符串,一直发送直到遇到\0为止
|
// 向某个端口写入数据。如果size为0,则把data当作字符串,一直发送直到遇到\0为止
|
||||||
bool SerialPort::OnWrite(const byte* buf, uint size)
|
bool SerialPort::OnWrite(const ByteArray& bs)
|
||||||
{
|
{
|
||||||
if(!size) return true;
|
if(!bs.Length()) return true;
|
||||||
|
|
||||||
// 如果队列已满,则强制刷出
|
|
||||||
if(Tx.Length() + size > Tx.Capacity()) Flush(Sys.Clock / 40000);
|
|
||||||
|
|
||||||
if(size == 0)
|
// 如果队列已满,则强制刷出
|
||||||
|
if(Tx.Length() + bs.Length() > Tx.Capacity()) Flush(Sys.Clock / 40000);
|
||||||
|
|
||||||
|
/*if(size == 0)
|
||||||
{
|
{
|
||||||
const byte* p = buf;
|
const byte* p = buf;
|
||||||
while(*p++) size++;
|
while(*p++) size++;
|
||||||
}
|
}*/
|
||||||
Tx.Write(buf, size, true);
|
Tx.Write(bs, true);
|
||||||
|
|
||||||
// 打开串口发送
|
// 打开串口发送
|
||||||
if(RS485) *RS485 = true;
|
if(RS485) *RS485 = true;
|
||||||
|
@ -296,14 +296,8 @@ void SerialPort::OnTxHandler()
|
||||||
}
|
}
|
||||||
|
|
||||||
// 从某个端口读取数据
|
// 从某个端口读取数据
|
||||||
uint SerialPort::OnRead(byte* buf, uint size)
|
uint SerialPort::OnRead(ByteArray& bs)
|
||||||
{
|
{
|
||||||
/*SmartIRQ irq;
|
|
||||||
uint count = Rx.Length(); // 收到的字节数
|
|
||||||
if(count > size) count = size;
|
|
||||||
for(int i=0; i<count; i++)
|
|
||||||
*buf++ = Rx.Pop();*/
|
|
||||||
|
|
||||||
// 如果有数据变化,等一会
|
// 如果有数据变化,等一会
|
||||||
uint count = 0;
|
uint count = 0;
|
||||||
uint len = Rx.Length();
|
uint len = Rx.Length();
|
||||||
|
@ -316,7 +310,8 @@ uint SerialPort::OnRead(byte* buf, uint size)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 从接收队列读取
|
// 从接收队列读取
|
||||||
count = Rx.Read(buf, size);
|
count = Rx.Read(bs);
|
||||||
|
bs.SetLength(count);
|
||||||
|
|
||||||
// 如果还有数据,打开任务
|
// 如果还有数据,打开任务
|
||||||
if(!Rx.Empty()) Sys.SetTask(_taskidRx, true);
|
if(!Rx.Empty()) Sys.SetTask(_taskidRx, true);
|
||||||
|
@ -344,14 +339,14 @@ void SerialPort::ReceiveTask(void* param)
|
||||||
assert_param2(sp, "串口参数不能为空 ReceiveTask");
|
assert_param2(sp, "串口参数不能为空 ReceiveTask");
|
||||||
|
|
||||||
// 从栈分配,节省内存
|
// 从栈分配,节省内存
|
||||||
byte buf[64];
|
ByteArray bs;
|
||||||
uint len = sp->Read(buf, ArrayLength(buf));
|
uint len = sp->Read(bs);
|
||||||
if(len)
|
if(len)
|
||||||
{
|
{
|
||||||
len = sp->OnReceive(buf, len);
|
len = sp->OnReceive(bs, NULL);
|
||||||
assert_param(len <= ArrayLength(buf));
|
//assert_param(len <= ArrayLength(buf));
|
||||||
// 如果有数据,则反馈回去
|
// 如果有数据,则反馈回去
|
||||||
if(len) sp->Write(buf, len);
|
if(len) sp->Write(bs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -438,8 +433,10 @@ extern "C"
|
||||||
if(_printf_sp)
|
if(_printf_sp)
|
||||||
{
|
{
|
||||||
//_printf_sp->SendData((byte)ch);
|
//_printf_sp->SendData((byte)ch);
|
||||||
byte bt = (byte)ch;
|
//byte bt = (byte)ch;
|
||||||
_printf_sp->Write(&bt, 1);
|
//_printf_sp->Write(&bt, 1);
|
||||||
|
ByteArray bs(ch, 1);
|
||||||
|
_printf_sp->Write(bs);
|
||||||
}
|
}
|
||||||
|
|
||||||
isInFPutc = false;
|
isInFPutc = false;
|
||||||
|
|
|
@ -81,8 +81,8 @@ protected:
|
||||||
virtual bool OnOpen();
|
virtual bool OnOpen();
|
||||||
virtual void OnClose();
|
virtual void OnClose();
|
||||||
|
|
||||||
virtual bool OnWrite(const byte* buf, uint size);
|
virtual bool OnWrite(const ByteArray& bs);
|
||||||
virtual uint OnRead(byte* buf, uint size);
|
virtual uint OnRead(ByteArray& bs);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static void OnHandler(ushort num, void* param);
|
static void OnHandler(ushort num, void* param);
|
||||||
|
|
|
@ -203,7 +203,8 @@ void TcpSocket::OnDataReceive(TCP_HEADER& tcp, uint len)
|
||||||
byte* data = tcp.Next();
|
byte* data = tcp.Next();
|
||||||
|
|
||||||
// 触发ITransport接口事件
|
// 触发ITransport接口事件
|
||||||
uint len2 = OnReceive(data, len);
|
ByteArray bs(data, len);
|
||||||
|
uint len2 = OnReceive(bs, NULL);
|
||||||
// 如果有返回,说明有数据要回复出去
|
// 如果有返回,说明有数据要回复出去
|
||||||
if(len2)
|
if(len2)
|
||||||
{
|
{
|
||||||
|
@ -492,14 +493,12 @@ bool TcpSocket::Connect(IPAddress& ip, ushort port)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TcpSocket::OnWrite(const byte* buf, uint len)
|
bool TcpSocket::OnWrite(const ByteArray& bs)
|
||||||
{
|
{
|
||||||
ByteArray bs(buf, len);
|
return Send(bs);
|
||||||
Send(bs);
|
|
||||||
return len;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint TcpSocket::OnRead(byte* buf, uint len)
|
uint TcpSocket::OnRead(ByteArray& bs)
|
||||||
{
|
{
|
||||||
// 暂时不支持
|
// 暂时不支持
|
||||||
return 0;
|
return 0;
|
||||||
|
|
12
TinyIP/Tcp.h
12
TinyIP/Tcp.h
|
@ -67,16 +67,8 @@ protected:
|
||||||
virtual bool OnOpen();
|
virtual bool OnOpen();
|
||||||
virtual void OnClose();
|
virtual void OnClose();
|
||||||
|
|
||||||
virtual bool OnWrite(const byte* buf, uint len);
|
virtual bool OnWrite(const ByteArray& bs);
|
||||||
virtual uint OnRead(byte* buf, uint len);
|
virtual uint OnRead(ByteArray& bs);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Tcp客户端
|
|
||||||
/*class TcpClient : public TcpSocket
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
TcpClient(TinyIP* tip);
|
|
||||||
};*/
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -66,8 +66,8 @@ void TinyIP::Init(ITransport* port)
|
||||||
uint TinyIP::Fetch(Stream& ms)
|
uint TinyIP::Fetch(Stream& ms)
|
||||||
{
|
{
|
||||||
// 获取缓冲区的包
|
// 获取缓冲区的包
|
||||||
//int len = _port->Read(ms);
|
ByteArray bs(ms.Current(), ms.Remain());
|
||||||
int len = _port->Read(ms.Current(), ms.Remain());
|
int len = _port->Read(bs);
|
||||||
// 如果缓冲器里面没有数据则转入下一次循环
|
// 如果缓冲器里面没有数据则转入下一次循环
|
||||||
if(len < sizeof(ETH_HEADER)) return 0;
|
if(len < sizeof(ETH_HEADER)) return 0;
|
||||||
|
|
||||||
|
@ -288,7 +288,8 @@ bool TinyIP::SendEthernet(ETH_TYPE type, const MacAddress& remote, const byte* b
|
||||||
/*Sys.ShowHex((byte*)eth->Next(), len, '-');
|
/*Sys.ShowHex((byte*)eth->Next(), len, '-');
|
||||||
debug_printf("\r\n");*/
|
debug_printf("\r\n");*/
|
||||||
|
|
||||||
return _port->Write((byte*)eth, len);
|
ByteArray bs((byte*)eth, len);
|
||||||
|
return _port->Write(bs);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TinyIP::SendIP(IP_TYPE type, const IPAddress& remote, const byte* buf, uint len)
|
bool TinyIP::SendIP(IP_TYPE type, const IPAddress& remote, const byte* buf, uint len)
|
||||||
|
|
|
@ -72,13 +72,13 @@ void UdpSocket::OnProcess(IP_HEADER& ip, UDP_HEADER& udp, Stream& ms)
|
||||||
assert_param2(len <= ms.Remain(), "UDP数据包不完整");
|
assert_param2(len <= ms.Remain(), "UDP数据包不完整");
|
||||||
|
|
||||||
// 触发ITransport接口事件
|
// 触发ITransport接口事件
|
||||||
uint len2 = OnReceive(data, len);
|
ByteArray bs(data, len);
|
||||||
|
uint len2 = OnReceive(bs, &CurRemote);
|
||||||
// 如果有返回,说明有数据要回复出去
|
// 如果有返回,说明有数据要回复出去
|
||||||
//if(len2) Write(data, len2);
|
//if(len2) Write(data, len2);
|
||||||
if(len2)
|
if(len2)
|
||||||
{
|
{
|
||||||
Remote = CurRemote;
|
Remote = CurRemote;
|
||||||
ByteArray bs(data, len2);
|
|
||||||
Send(bs);
|
Send(bs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -149,11 +149,9 @@ bool UdpSocket::Send(const ByteArray& bs)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool UdpSocket::OnWrite(const byte* buf, uint len)
|
bool UdpSocket::OnWrite(const ByteArray& bs)
|
||||||
{
|
{
|
||||||
ByteArray bs(buf, len);
|
return Send(bs);
|
||||||
Send(bs);
|
|
||||||
return len;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint UdpSocket::Receive(ByteArray& bs)
|
uint UdpSocket::Receive(ByteArray& bs)
|
||||||
|
@ -161,7 +159,7 @@ uint UdpSocket::Receive(ByteArray& bs)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint UdpSocket::OnRead(byte* buf, uint len)
|
uint UdpSocket::OnRead(ByteArray& bs)
|
||||||
{
|
{
|
||||||
// 暂时不支持
|
// 暂时不支持
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -38,8 +38,8 @@ protected:
|
||||||
virtual bool OnOpen();
|
virtual bool OnOpen();
|
||||||
virtual void OnClose();
|
virtual void OnClose();
|
||||||
|
|
||||||
virtual bool OnWrite(const byte* buf, uint len);
|
virtual bool OnWrite(const ByteArray& bs);
|
||||||
virtual uint OnRead(byte* buf, uint len);
|
virtual uint OnRead(ByteArray& bs);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -486,7 +486,8 @@ void TinyController::Loop()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// 发送消息
|
// 发送消息
|
||||||
Port->Write(node.Data, node.Length);
|
ByteArray bs(node.Data, node.Length);
|
||||||
|
Port->Write(bs);
|
||||||
|
|
||||||
// 增加发送次数统计
|
// 增加发送次数统计
|
||||||
Total.Send++;
|
Total.Send++;
|
||||||
|
|
Loading…
Reference in New Issue