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