[C] 纯文本查看 复制代码
PC软件定时执行 ReadPrint(0)
通过 MODH_61H() 解析TOOL返回结果
/*
*********************************************************************************************************
* 函 数 名: udp_Send61H
* 功能说明: 发送61h指令,
* 形 参:
* 返 回 值: 无
*********************************************************************************************************
*/
void udp_Send61HEx(uint8_t _485Addr, uint16_t _func, uint32_t _rxlen, uint16_t _txId, uint32_t _txlen, uint8_t *_txbuf)
{
/*
主机发送: 查询H7-TOOL有没printf数据上报,或者CAN, UART数据
01 ; 站号
61 ; 功能码
0001 ; 子功能,
H61_PRINT = 0,
H61_RTT_VIEWER = 1,
H61_UART = 2,
H61_CAN = 3,
0020 0000 : 需要读取的数据最大长度 4字节 (0表示自动)
0001 : 下传通道号
0020 0000 : 需要携带下传的数据
... 数据
CCCC : CRC16
从机应答:
01 ; 从机地址
61 ; 功能码
0000 ; 子功能
0020 0000 : 实际上报的数据长度 4字节 , 0表示没有数据上报
... 数据
CCCC : CRC16
*/
uint8_t pos = 0;
uint16_t crc;
uint32_t i;
g_tCmd.RS485Addr = _485Addr;
if (_txlen > TX_BUF_SIZE - 10)
{
return;
}
g_tCmd.RxOk = 0;
s_TxLen = 0;
s_TxBuf[s_TxLen++] = g_tCmd.RS485Addr;
s_TxBuf[s_TxLen++] = 0x61; /* 功能码 */
s_TxBuf[s_TxLen++] = _func >> 8;
s_TxBuf[s_TxLen++] = _func >> 0;
s_TxBuf[s_TxLen++] = _rxlen >> 24;
s_TxBuf[s_TxLen++] = _rxlen >> 16;
s_TxBuf[s_TxLen++] = _rxlen >> 8;
s_TxBuf[s_TxLen++] = _rxlen >> 0;
s_TxBuf[s_TxLen++] = _txId >> 8;
s_TxBuf[s_TxLen++] = _txId >> 0;
s_TxBuf[s_TxLen++] = _txlen >> 24;
s_TxBuf[s_TxLen++] = _txlen >> 16;
s_TxBuf[s_TxLen++] = _txlen >> 8;
s_TxBuf[s_TxLen++] = _txlen >> 0;
for (i = 0; i < _txlen; i++)
{
s_TxBuf[s_TxLen++] = _txbuf[i];
}
crc = CRC16_Modbus(s_TxBuf, s_TxLen);
s_TxBuf[s_TxLen++] = crc >> 8;
s_TxBuf[s_TxLen++] = crc;
udp_SendBuf(s_TxBuf, s_TxLen);
}
void udp_Send61H(uint16_t _func, uint32_t _rxlen, uint16_t _txId, uint32_t _txlen, uint8_t *_txbuf)
{
udp_Send61HEx(1, _func, _rxlen, _txId, _txlen, _txbuf);
}
// ReadPrint
void __fastcall TFormTcp::ReadPrint(uint32_t _func)
{
uint16_t func;
uint16_t PackagLen = 1024;
if (g_tIniParam.CommInterface == COMM_IF_USB_COM) /* USB虚拟串口 */
{
PackagLen = 1024;
}
else if (g_tIniParam.CommInterface == COMM_IF_RJ45) /* 网口和WIFI , TCP UDP协议 */
{
PackagLen = 1024;
}
else if (g_tIniParam.CommInterface == COMM_IF_USB_HID) /* USB HID */
{
PackagLen = 4096;
}
/*
H61_PRINT = 0,
H61_RTT_VIEWER = 1,
H61_UART = 2,
H61_CAN = 3,
*/
func = H61_PRINT;
while (g_tCmd.CmdStatus != 0 && FormTcp->RequestClose == 0)
{
// 通信异常处理
if (g_tCmd.LinkStateErr == 1)
{
g_tCmd.CmdStatus = CMDS_INIT_COMM_PORT;
return;
}
switch (g_tCmd.CmdStatus)
{
/*-------读print数据----------*/
case CMDS_READ_PRINT:
udp_Send61H(H61_PRINT + 0x100, 1024, 0, 0, 0); // 高字节表示首发命令
if (H7_WaitResponse(ACK_61H, MODS_CMD_TIMEOUT) == 0)
{
g_tCmd.CmdStatus++;
}
else
{
g_tCmd.CmdStatus = 0;
}
break;
case CMDS_READ_PRINT + 1:
if (func == H61_PRINT)
{
udp_Send61H(func, PackagLen, 0, 0, 0);
}
else /* 可以携带数据下传 */
{
uint8_t txbuf[2048];
uint32_t i;
uint32_t len = 0;
uint32_t TxWrite;
//uint16_t ChanId = 0;
if (func == H61_UART)
{
try
{
if (FormUart->fUartClearCounter == 1)
{
FormUart->fUartClearCounter = 0;
func = func + 0x0100;
}
TxWrite = g_tUartTerFifo.TxWrite;
for (i = 0; i < 1000; i++)
{
if (g_tUartTerFifo.TxRead == TxWrite)
{
break;
}
txbuf[len++] = g_tUartTerFifo.TxBuf[g_tUartTerFifo.TxRead];
if (++g_tUartTerFifo.TxRead >= TER_TX_FIFO_SIZE)
{
g_tUartTerFifo.TxRead = 0;
}
}
}
catch (Exception &e)
{
// AnsiString s;
// s = "CMDS_READ_PRINT+1 异常 : func = " + IntToStr((int)func) ;
// SendMsgPrint(s.c_str());
//
// g_tCmd.CmdStatus = 0;
// break;
}
}
else if (func == H61_RTT_VIEWER)
{
TxWrite = g_tRttTerFifo.TxWrite;
for (i = 0; i < 1000; i++)
{
if (g_tRttTerFifo.TxRead == TxWrite)
{
break;
}
txbuf[len++] = g_tRttTerFifo.TxBuf[g_tRttTerFifo.TxRead];
if (++g_tRttTerFifo.TxRead >= g_tRttTerFifo.TxFifoSize)
{
g_tRttTerFifo.TxRead = 0;
}
}
}
else if (func == H61_CAN)
{
try
{
if (FormCan->fCanClearCounter == 1)
{
FormCan->fCanClearCounter = 0;
func = func + 0x0100;
}
TxWrite = g_tCanTerFifo.TxWrite;
for (i = 0; i < 1000; i++)
{
if (g_tCanTerFifo.TxRead == TxWrite)
{
break;
}
txbuf[len++] = g_tCanTerFifo.TxBuf[g_tCanTerFifo.TxRead];
if (++g_tCanTerFifo.TxRead >= TER_TX_FIFO_SIZE)
{
g_tCanTerFifo.TxRead = 0;
}
}
}
catch (Exception &e)
{
AnsiString s;
s = "CMDS_READ_PRINT+1 异常 : func = " + IntToStr((int)func) ;
SendMsgPrint(s.c_str());
g_tCmd.CmdStatus = 0;
break;
}
}
else if (func == H61_ADC)
{
try
{
// if (FormCan->fCanClearCounter == 1)
// {
// FormCan->fCanClearCounter = 0;
// func = func + 0x0100;
// }
TxWrite = g_tAdcFifo.TxWrite;
for (i = 0; i < 1000; i++)
{
if (g_tAdcFifo.TxRead == TxWrite)
{
break;
}
txbuf[len++] = g_tAdcFifo.TxBuf[g_tAdcFifo.TxRead];
if (++g_tAdcFifo.TxRead >= TER_TX_FIFO_SIZE)
{
g_tAdcFifo.TxRead = 0;
}
}
}
catch (Exception &e)
{
AnsiString s;
s = "CMDS_READ_PRINT+1 异常 : func = " + IntToStr((int)func) ;
SendMsgPrint(s.c_str());
g_tCmd.CmdStatus = 0;
break;
}
}
else
{
g_tCmd.CmdStatus = 0;
break;
}
//udp_Send61H(func, 1024, ChanId, len, txbuf);
// modbus 虚拟从机需要发送
{
if (FormUart->mPCSendChanId >= 100)
{
udp_Send61H(func, PackagLen, FormUart->mPCSendChanId - 100, len, txbuf);
/* 还原发送通道 */
if (len > 0)
{
FormUart->mPCSendChanId = FormUart->ComboBoxSendUartNo->ItemIndex;
}
}
else
{
//if (func == H61_RTT_VIEWER) bsp_AddLog(" READ_PRINT H61_RTT_VIEWER");
//else if (func == H61_UART) bsp_AddLog(" READ_PRINT H61_UART");
//else if (func == H61_CAN) bsp_AddLog(" READ_PRINT H61_CAN");
udp_Send61H(func, PackagLen, FormUart->mPCSendChanId, len, txbuf);
}
}
}
try
{
if (H7_WaitResponse(ACK_61H, MODS_CMD_TIMEOUT) == 0) // 通信成功 100 改为1秒
{
if (FormTcp->H61_RxNewData == 1) // 有新数据 继续读
{
if (g_tCmd.UserReq == 1) /* 优先响应用户指令 */
{
g_tCmd.CmdStatus = CMDS_READ_PRINT + 2;
}
else
{
FormTcp->H61_RxNewData = 0;
g_tCmd.CmdStatus = CMDS_READ_PRINT + 1;
}
}
else
{
uint8_t MaxFunc;
if (g_tDevPa.AppVer == 0) // 未读到APP 版本时
{
MaxFunc = H61_CAN;
}
else if (g_tDevPa.AppVer < 0x205) // V2.05才支持CAN
{
MaxFunc = H61_UART;
}
else if (g_tDevPa.AppVer < 0x222) // V2.22 才支持ADC1 ADC2
{
MaxFunc = H61_CAN;
}
else
{
MaxFunc = H61_ADC;
}
if (++func > MaxFunc)
{
g_tCmd.CmdStatus = CMDS_READ_PRINT + 2; /* 6个通道数据采集完毕 */
}
else
{
g_tCmd.CmdStatus = CMDS_READ_PRINT + 1;
}
}
}
else // 通信超时
{
//bsp_AddLog(" -1 Timeout ");
SetCommState(-1); /* 改变指示灯 */
g_tCmd.CmdStatus = 0;
}
}
catch (Exception &e)
{
AnsiString s;
s = "H7_WaitResponse(ACK_61H)异常: " + e.Message;
SendMsgPrint(s.c_str());
g_tCmd.LinkStateErr = 1;
g_tCmd.CmdStatus = CMDS_INIT_COMM_PORT;
//g_tCmd.CmdStatus = 0;
}
break;
case CMDS_READ_PRINT + 2:
g_tCmd.CmdStatus = 0;
break;
default:
g_tCmd.CmdStatus = 0;
break;
}
}
}
// 解析 61H命令
void __fastcall TFormTcp::MODH_61H(uint8_t *_rx_buf, uint16_t _len)
{
/*
主机发送: 查询H7-TOOL有没printf数据上报,或者CAN, UART数据
01 ; 站号
61 ; 功能码
0001 ; 子功能, 高byte = 1 表示需要清FIFO
H61_PRINT = 0,
H61_RTT_VIEWER = 1,
H61_UART1 = 2,
H61_UART2 = 3,
H61_UART3 = 4,
H61_CAN = 5,
H61_ADC1 = 6
H61_ADC2 = 7
0020 0000 : 需要读取的数据最大长度 4字节 (0表示自动)
0020 0000 : 需要携带下传的数据
... 数据
CCCC : CRC16
从机应答:
01 ; 从机地址
61 ; 功能码
0000 ; 子功能
0020 0000 : 实际上报的数据长度 4字节 , 0表示没有数据上报
... 数据
CCCC : CRC16
*/
uint16_t func;
uint8_t ch;
uint32_t len;
uint16_t pos;
pos = 2;
func = BEBufToUint16(&_rx_buf[pos]) & 0xFF;
pos += 2;
len = BEBufToUint32(&_rx_buf[pos]);
pos += 4;
if (func == H61_PRINT)
{
if (Form1->CheckBoxPause->Checked == false)
{
for (int i = 0; i < len; i++)
{
g_tPrintFifo.RxBuf[g_tPrintFifo.RxWrite] = _rx_buf[pos++];
if (++g_tPrintFifo.RxWrite >= g_tPrintFifo.RxFifoSize)
{
g_tPrintFifo.RxWrite = 0;
}
}
if (len > 0)
{
FormTcp->H61_RxNewData = 1; // 表示有新数据,通知轮询程序继续读
if (g_tPrintFifo.NewMsg == 0)
{
g_tPrintFifo.NewMsg = 1;
PostMessage(FormTcp->Handle, WM_USER_DISP_PRINT_STREAM, 0, 0);
}
else
{
g_tPrintFifo.NewMsg = 1; // 速度慢了 来这里
PostMessage(FormTcp->Handle, WM_USER_DISP_PRINT_STREAM, 0, 0);
}
}
}
}
else if (func == H61_UART)
{
/* 先保存前8字节,TOOL记录的2个串口接收字节总数 */
mTerUartRxCount1 = BEBufToUint32(_rx_buf + pos); pos += 4;
mTerUartRxCount2 = BEBufToUint32(_rx_buf + pos); pos += 4;
for (int i = 0; i < len - 8; i++)
{
g_tUartTerFifo.RxBuf[g_tUartTerFifo.RxWrite] = _rx_buf[pos++];
if (++g_tUartTerFifo.RxWrite >= g_tUartTerFifo.RxFifoSize)
{
g_tUartTerFifo.RxWrite = 0;
}
}
if (len > 8)
{
FormTcp->H61_RxNewData = 1; // 表示有新数据,通知轮询程序继续读
if (g_tUartTerFifo.NewMsg == 0)
{
g_tUartTerFifo.NewMsg = 1;
// PostMessage(FormTcp->Handle, WM_USER_DISP_UART_STREAM, 0, 0);
}
else
{
g_tUartTerFifo.NewMsg = 1; // 速度慢了 来这里
}
}
}
else if (func == H61_CAN)
{
/* 先保存前8字节,TOOL记录的1个串口接收总行数 */
mTerCanRxCount1 = BEBufToUint32(_rx_buf + pos); pos += 4;
mTerCanRxCount2 = BEBufToUint32(_rx_buf + pos); pos += 4;
for (int i = 0; i < len - 8; i++)
{
g_tCanTerFifo.RxBuf[g_tCanTerFifo.RxWrite] = _rx_buf[pos++];
if (++g_tCanTerFifo.RxWrite >= g_tCanTerFifo.RxFifoSize)
{
g_tCanTerFifo.RxWrite = 0;
}
}
if (len > 8)
{
FormTcp->H61_RxNewData = 1; // 表示有新数据,通知轮询程序继续读
if (g_tCanTerFifo.NewMsg == 0)
{
g_tCanTerFifo.NewMsg = 1;
//FormTcp->PostMsgCode(WM_USER_DISP_CAN_STREAM, 0);
}
else
{
g_tCanTerFifo.NewMsg = 1; // 速度慢了 来这里
}
}
}
else if (func == H61_RTT_VIEWER)
{
for (int i = 0; i < len; i++)
{
g_tRttTerFifo.RxBuf[g_tRttTerFifo.RxWrite] = _rx_buf[pos++];
if (++g_tRttTerFifo.RxWrite >= g_tRttTerFifo.RxFifoSize)
{
g_tRttTerFifo.RxWrite = 0;
}
if (g_tRttTerFifo.RxWrite == g_tRttTerFifo.RxRead)
{
/* fifo 满了 */
g_tRttTerFifo.Full = 1;
{
unsigned int wParam;
long lParam;
wParam = (unsigned int)"FIFO满了";
lParam = 0;
SendMessage(FormTcp->Handle, WM_USER_RTT_MEMO1_DISP, wParam, lParam);
}
}
}
if (len > 0)
{
FormTcp->H61_RxNewData = 1; // 表示有新数据,通知轮询程序继续读
if (g_tRttTerFifo.NewMsg == 0)
{
g_tRttTerFifo.NewMsg = 1;
// PostMessage(FormTcp->Handle, WM_USER_DISP_RTT_STREAM, 0, 0);
}
else
{
g_tRttTerFifo.NewMsg = 1; // 速度慢了 来这里
}
}
}
}