传输口增加最小数据包大小

This commit is contained in:
nnhy 2015-09-25 10:02:29 +00:00
parent f4f5180655
commit 8d9143ce56
6 changed files with 49 additions and 16 deletions

View File

@ -32,6 +32,8 @@ bool ShunCom::OnOpen()
Sys.Delay(100); Sys.Delay(100);
Reset = true; Reset = true;
Port->MinSize = MinSize;
return PackPort::OnOpen(); return PackPort::OnOpen();
} }
@ -46,6 +48,24 @@ void ShunCom::OnClose()
PackPort::OnClose(); PackPort::OnClose();
} }
void ShunCom::ShowConfig()
{
if(!Open()) return;
Config = true;
Sys.Sleep(3000);
byte buf[] = { 0xFE, 0x00, 0x21, 0x15, 0x34 };
ByteArray bs(buf, ArrayLength(buf));
Write(bs);
Sys.Sleep(300);
ByteArray rs;
Read(rs);
rs.Show(true);
}
bool ShunCom::OnWrite(const ByteArray& bs) bool ShunCom::OnWrite(const ByteArray& bs)
{ {
//Led = !Led; //Led = !Led;

View File

@ -28,6 +28,8 @@ public:
void Init(ITransport* port, Pin rst = P0); void Init(ITransport* port, Pin rst = P0);
void ShowConfig();
virtual bool OnWrite(const ByteArray& bs); virtual bool OnWrite(const ByteArray& bs);
// 引发数据到达事件 // 引发数据到达事件
virtual uint OnReceive(ByteArray& bs, void* param); virtual uint OnReceive(ByteArray& bs, void* param);

View File

@ -34,6 +34,7 @@ void Controller::Open()
assert_param2(Port, "还没有传输口呢"); assert_param2(Port, "还没有传输口呢");
Port->MinSize = MinSize;
// 注册收到数据事件 // 注册收到数据事件
Port->Register(Dispatch, this); Port->Register(Dispatch, this);
Port->Open(); Port->Open();
@ -60,10 +61,16 @@ uint Controller::Dispatch(ITransport* port, ByteArray& bs, void* param, void* pa
Controller* control = (Controller*)param; Controller* control = (Controller*)param;
#if MSG_DEBUG
msg_printf("TinyNet::Dispatch[%d] ", len);
// 输出整条信息
Sys.ShowHex(buf, len, '-');
msg_printf("\r\n");
#endif
if(len > control->Port->MaxSize) if(len > control->Port->MaxSize)
{ {
#if MSG_DEBUG #if MSG_DEBUG
msg_printf("TinyNet::Dispatch "); msg_printf("TinyNet::Dispatch[%d] ", len);
// 输出整条信息 // 输出整条信息
Sys.ShowHex(buf, len, '-'); Sys.ShowHex(buf, len, '-');
msg_printf("\r\n"); msg_printf("\r\n");

View File

@ -8,7 +8,7 @@ ITransport::ITransport()
Opening = false; Opening = false;
Opened = false; Opened = false;
//MinSize = 0; MinSize = 0;
MaxSize = 0; MaxSize = 0;
_handler = NULL; _handler = NULL;

View File

@ -20,7 +20,7 @@ public:
bool Opening; // 是否正在打开 bool Opening; // 是否正在打开
bool Opened; // 是否打开 bool Opened; // 是否打开
//ushort MinSize; // 数据包最小大小 ushort MinSize; // 数据包最小大小
ushort MaxSize; // 数据包最大大小 ushort MaxSize; // 数据包最大大小
// 初始化 // 初始化

View File

@ -36,11 +36,12 @@ SerialPort::~SerialPort()
void SerialPort::Init() void SerialPort::Init()
{ {
_index = 0xFF; _index = 0xFF;
RS485 = NULL; RS485 = NULL;
Error = 0; Error = 0;
IsRemap = false; IsRemap = false;
MinSize = 1;
_taskidRx = 0; _taskidRx = 0;
} }
@ -51,11 +52,11 @@ void SerialPort::Init(byte index, int baudRate, byte parity, byte dataBits, byte
_index = index; _index = index;
assert_param(_index < ArrayLength(g_Uart_Ports)); assert_param(_index < ArrayLength(g_Uart_Ports));
_port = g_Uart_Ports[_index]; _port = g_Uart_Ports[_index];
_baudRate = baudRate; _baudRate = baudRate;
_parity = parity; _parity = parity;
_dataBits = dataBits; _dataBits = dataBits;
_stopBits = stopBits; _stopBits = stopBits;
// 计算字节间隔。字节速度一般是波特率转为字节后再除以2 // 计算字节间隔。字节速度一般是波特率转为字节后再除以2
//_byteTime = 15000000 / baudRate; // (1000000 /(baudRate/10)) * 1.5 //_byteTime = 15000000 / baudRate; // (1000000 /(baudRate/10)) * 1.5
@ -312,8 +313,10 @@ uint SerialPort::OnRead(ByteArray& bs)
Sys.Delay(_byteTime); Sys.Delay(_byteTime);
len = Rx.Length(); len = Rx.Length();
} }
// 如果数据大小不足,等下次吧
if(len < MinSize) return 0;
debug_printf("串口接收 %d 间隔 %dus \r\n", len, _byteTime); debug_printf("串口接收 %d 间隔 %dus 最小 %d \r\n", len, _byteTime, MinSize);
// 从接收队列读取 // 从接收队列读取
count = Rx.Read(bs, true); count = Rx.Read(bs, true);
bs.SetLength(count); bs.SetLength(count);
@ -328,11 +331,12 @@ void SerialPort::OnRxHandler()
{ {
byte dat = (byte)USART_ReceiveData(_port); byte dat = (byte)USART_ReceiveData(_port);
Rx.Push(dat); Rx.Push(dat);
//debug_printf(" 0x%02X ", dat);
// 收到数据,开启任务调度 // 收到数据,开启任务调度
if(_taskidRx) Sys.SetTask(_taskidRx, true); if(_taskidRx) Sys.SetTask(_taskidRx, true);
if(!HasHandler()) return; //if(!HasHandler()) return;
// 其实内部的USART_ReceiveData可以清除USART_IT_RXNE // 其实内部的USART_ReceiveData可以清除USART_IT_RXNE
//USART_ClearITPendingBit(sp->_port, USART_IT_RXNE); //USART_ClearITPendingBit(sp->_port, USART_IT_RXNE);
@ -391,9 +395,9 @@ void SerialPort::OnHandler(ushort num, void* param)
// 读取并扔到错误数据 // 读取并扔到错误数据
USART_ReceiveData(sp->_port); USART_ReceiveData(sp->_port);
} }
if(USART_GetFlagStatus(sp->_port, USART_FLAG_NE) != RESET) USART_ClearFlag(sp->_port, USART_FLAG_NE); /*if(USART_GetFlagStatus(sp->_port, USART_FLAG_NE) != RESET) USART_ClearFlag(sp->_port, USART_FLAG_NE);
if(USART_GetFlagStatus(sp->_port, USART_FLAG_FE) != RESET) USART_ClearFlag(sp->_port, USART_FLAG_FE); if(USART_GetFlagStatus(sp->_port, USART_FLAG_FE) != RESET) USART_ClearFlag(sp->_port, USART_FLAG_FE);
if(USART_GetFlagStatus(sp->_port, USART_FLAG_PE) != RESET) USART_ClearFlag(sp->_port, USART_FLAG_PE); if(USART_GetFlagStatus(sp->_port, USART_FLAG_PE) != RESET) USART_ClearFlag(sp->_port, USART_FLAG_PE);*/
} }
// 获取引脚 // 获取引脚