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

View File

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

View File

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

View File

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