独立Set485接口

This commit is contained in:
nnhy 2016-10-29 01:41:01 +00:00
parent ac84f53824
commit 744b9d34bb
5 changed files with 26 additions and 21 deletions

View File

@ -78,7 +78,7 @@ bool SerialPort::OnOpen()
OnOpen2();
if(RS485) *RS485 = false;
Set485(false);
return true;
}
@ -96,13 +96,13 @@ bool SerialPort::OnWrite(const Buffer& bs)
{
if(!bs.Length()) return true;
/*#if defined(STM32F0) || defined(GD32F150)
if(RS485) *RS485 = true;
Set485(true);
// 中断发送过于频繁,影响了接收中断,采用循环阻塞发送。后面考虑独立发送任务
for(int i=0; i<bs.Length(); i++)
{
SendData(bs[i], 3000);
}
if(RS485) *RS485 = false;
Set485(false);
#else*/
// 如果队列已满,则强制刷出
if(Tx.Length() + bs.Length() > Tx.Capacity()) Flush(Sys.Clock / 40000);
@ -110,7 +110,7 @@ bool SerialPort::OnWrite(const Buffer& bs)
Tx.Write(bs);
// 打开串口发送
if(RS485) *RS485 = true;
Set485(true);
//USART_ITConfig((USART_TypeDef*)_port, USART_IT_TXE, ENABLE);
OnWrite2();
//#endif
@ -121,18 +121,14 @@ bool SerialPort::OnWrite(const Buffer& bs)
// 刷出某个端口中的数据
bool SerialPort::Flush(uint times)
{
//#if !(defined(STM32F0) || defined(GD32F150))
// 打开串口发送
if(RS485) *RS485 = true;
Set485(true);
while(!Tx.Empty() && times > 0) times = SendData(Tx.Pop(), times);
if(RS485) *RS485 = false;
Set485(false);
return times > 0;
/*#else
return true;
#endif*/
}
// 从某个端口读取数据
@ -177,7 +173,6 @@ uint SerialPort::OnRead(Buffer& bs)
void SerialPort::ReceiveTask()
{
//auto sp = (SerialPort*)param;
auto sp = this;
//!!! 只要注释这一行,四位触摸开关就不会有串口溢出错误
@ -263,3 +258,17 @@ SerialPort* SerialPort::GetMessagePort()
}
return sp;
}
void SerialPort::Set485(bool flag)
{
if(RS485)
{
if(!flag) Sys.Sleep(1);
*RS485 = flag;
if(flag) Sys.Sleep(1);
/*if(flag)
debug_printf("485 高\r\n");
else
debug_printf("485 低\r\n");*/
}
}

View File

@ -83,6 +83,7 @@ private:
static void OnHandler(ushort num, void* param);
void OnTxHandler();
void OnRxHandler();
void Set485(bool flag);
void* _task;
uint _taskidRx;

View File

@ -168,16 +168,14 @@ void SerialPort::OnWrite2()
void SerialPort::OnTxHandler()
{
//#if !(defined(STM32F0) || defined(GD32F150))
if(!Tx.Empty())
USART_SendData((USART_TypeDef*)_port, (ushort)Tx.Pop());
else
{
USART_ITConfig((USART_TypeDef*)_port, USART_IT_TXE, DISABLE);
if(RS485) *RS485 = false;
Set485(false);
}
//#endif
}
void SerialPort::OnRxHandler()

View File

@ -168,16 +168,14 @@ void SerialPort::OnWrite2()
void SerialPort::OnTxHandler()
{
//#if !(defined(STM32F0) || defined(GD32F150))
if(!Tx.Empty())
USART_SendData((USART_TypeDef*)_port, (ushort)Tx.Pop());
else
{
USART_ITConfig((USART_TypeDef*)_port, USART_IT_TXE, DISABLE);
if(RS485) *RS485 = false;
Set485(false);
}
//#endif
}
void SerialPort::OnRxHandler()

View File

@ -9,12 +9,9 @@ static uint OnUsartRead(ITransport* transport, Buffer& bs, void* param, void* pa
bs.Show(true);
bs.AsString().Show(true);
// 休眠50ms某些USB转RS232芯片需要这个延迟
Sys.Sleep(50);
// 原路发回去
// 部分核心板COM4用于WiFi模块
if(sp->Name[3] != '4')
if(!bs.AsString().Contains("ERROR"))
{
String str = sp->Name;
str += " 收到:";
@ -38,6 +35,8 @@ static void TestSerialTask(void* param)
{
auto sp = new SerialPort(coms[i], 115200);
sp->Register(OnUsartRead, sp);
// COM5是RS485
if(coms[i] == COM5) sp->RS485 = new OutputPort(PC9, false);
sp->Open();
list.Add(sp);