独立Set485接口
This commit is contained in:
parent
ac84f53824
commit
744b9d34bb
|
@ -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");*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue