#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
Server = new TcpServer(this);
tcpSocket = new QTcpSocket;
//有数据
connect(Server,SIGNAL(sig_hasData(qintptr,QString,int,QByteArray)),
this,SLOT(slot_updateData(qintptr,QString,int,QByteArray)));
}
MainWindow::~MainWindow()
{
delete ui;
}
#include<QComboBox>
#include<QLineEdit>
//=============接收数据===============================================================
#include<QMessageBox>
void MainWindow::slot_updateData(qintptr serverSocketID,QString IP,int Port,QByteArray data)
{
QString DATA;
for(int i=0;i<data.size();i++)
{
DATA+=QString::number((unsigned char)data.at(i),16).toUpper().rightJustified(2,QChar('0'))+" ";
}
// QString str=QString("socket: %1,ip: %2,port:%3 收到->: %4\n").arg(serverSocketID).arg(IP).arg(Port).arg(DATA);
QString str=QString("\n接收原始数据: %1").arg(DATA);
ui->plainTextEdit_show->appendPlainText(str);
uint8_t telegramData[17]={0};
int dataSize=0;
if(data.at(2)==0x01)//state
{
//发来的 数据解析
const unsigned char * p= (const unsigned char *)data.constData();
// Start of each telegram
uint16_t count = ((uint16_t)p[3])<<8 | p[4]; //计数
//数据发送
dataSize=17;
telegramData[0] = 0x02;
telegramData[1] = 0x0d;//0D
telegramData[2] = 0x01;//01
// set telegram counter
telegramData[3] = p[3];//((char*)&count)[0];
telegramData[4] = p[4];//((char*)&count)[1];
// set pos id
uint16_t curPos=ui->lineEditPositionID->text().toInt() ; //当前位置 手动切换
telegramData[5] = ((char*)&curPos)[1];
telegramData[6] = ((char*)&curPos)[0];
// set op mode
// case 'A': ACTING;
// case 'I': IDLE;
// case 'M': MOVING;
// case 'E': ERROR;
// case 'C': CHARGING;
// default: UNKNOWN;
char operMode=ui->comboBoxMode->currentText().toUtf8().at(0);// 操作模式? M=executing
telegramData[7] =operMode; // op_mode;
// set load state
// case 'E' EMPTY;
// case 'F' FULL;
// default: UNKNOWN;
char load=ui->comboBoxLoad->currentText().toUtf8().at(0);// 负载 手动切换
telegramData[8] = load; //load_state;
// set last received order id
uint16_t last_recv_order_id=ui->lineEditRecvedOrderID->text().toUInt();//lastReceivedOrder
telegramData[9] = ((char*)&last_recv_order_id)[1];//高低字节位置不同
telegramData[10] = ((char*)&last_recv_order_id)[0];
// set current order id
uint16_t currentID=ui->lineEditOrderID->text().toUInt();//订单id,收到订单ID时自动填充
telegramData[11] = ((char*)¤tID)[1];//((char*)¤t_order_id)[0];
telegramData[12] = ((char*)¤tID)[0]; //((char*)¤t_order_id)[1];
// set last finished order id
uint16_t lastfinished_order_id=ui->lineEditFinishedOrderID->text().toUInt();//lastFinishedOrder
telegramData[13] = ((char*)&lastfinished_order_id)[1];//高低字节位置不同
telegramData[14] = ((char*)&lastfinished_order_id)[0];
// set checksum
telegramData[15] = checkSum(telegramData);
telegramData[16] = 0x03; //03
QString ss=QString(" 收到状态请求:counter=%1。\n"
" 发出数据解析:counter=%2,当前位置=%3,操作=%4,负载=%5,收到订单=%6,当前订单=%7,完成订单=%8 ")
.arg(count).arg(count).arg(curPos).arg(operMode)
.arg(load).arg(last_recv_order_id).arg(currentID).arg(lastfinished_order_id);
ui->plainTextEdit_show->appendPlainText(ss);
}
else if(data.at(2)==0x02)//order
{
//发来的 数据解析
const unsigned char * p= (const unsigned char *)data.constData();
ui->comboBoxMode->setCurrentText("M");//设置为executing 。A 这个先不管
// Start of each telegram
uint16_t count = (uint16_t)p[3]<<8 | p[4]; //计数 高低字节位置不同
uint16_t orderID=(uint16_t)p[5]<<8 | p[6]; //order id 高低字节位置不同
uint16_t destinationID=(uint16_t)p[7]<<8 | p[8];
static int init=0;
if(!init)
{//第一次配置的时候,将最后收到的订单设置为当前订单
init=1;
ui->lineEditOrderID->setText(QString::number(orderID));//设置当前订单
ui->lineEditDestinationID->setText(QString::number(destinationID));//destination id 配置目的地
}
//设置最后收到的订单
ui->lineEditRecvedOrderID->setText(QString::number(orderID));//设置控件,作为数据保存
ui->lineEditRecvedDestinationID->setText(QString::number(destinationID));//设置,作为数据保存
/*N none;L load;U unload; C Charge */
char destinationAction=p[9];//到了目的地的动作,这个先不管
//数据发送
dataSize=9;
telegramData[0] = 0x02;//02
telegramData[1] = 0x05;//05
telegramData[2] = 0x02;//02
// set telegram counter
telegramData[3] = p[3];
telegramData[4] = p[4];
// set last received order id 最后收到的订单
telegramData[5] = ((char*)&orderID)[1];//p[5];
telegramData[6] = ((char*)&orderID)[0];//p[6];
// set checksum
telegramData[7] = checkSum(telegramData);
telegramData[8] = 0x03;//03
QString ss=QString(" 收到订单请求:counter=%1,订单=%2,目的地ID=%3,目的地动作=%4,\n"
" 发出数据解析:counter=%5,最后收到的订单=%6 ").arg(count).arg(orderID).arg(destinationID).arg(destinationAction)
.arg(count).arg(orderID);
ui->plainTextEdit_show->appendPlainText(ss);
}
else
{
QMessageBox::critical(this,"错误","收到了错误的数据帧");
return;
}
DATA.clear();
QByteArray datatosend;
for(int i=0;i<dataSize;i++)
{
DATA+=QString::number(telegramData[i],16).toUpper().rightJustified(2,QChar('0'))+" ";
}
str=QString("发送原始数据:%1").arg(DATA);
ui->plainTextEdit_show->appendPlainText(str);
datatosend.append((char *)telegramData,dataSize);
// datatosend=DATA.toUtf8();
m_data=datatosend;
BroadCast(datatosend);
}
uint8_t MainWindow::checkSum(uint8_t *buf)
{
uint8_t cs = 0;
for (int i = 0; i < buf[1]; i++) {
cs ^= buf[2 + i];
}
return cs;
}
//============广播信息=========================================================
void MainWindow::BroadCast(QByteArray data)
{
QMap <int,TcpSocket *>::const_iterator Device;
for(Device=Server->IDSocketMap.constBegin();Device!=Server->IDSocketMap.constEnd();++Device)
{
Device.value()->write(data);
}
}
//=====================================================================
void MainWindow::on_pushButton_open_clicked() //启动服务器
{
ui->pushButton_open->setEnabled(false);
ui->pushButton_close->setEnabled(true);
int Port = 2000;
Server->listen(QHostAddress::Any,Port);//监听客户端连接
ui->label_IP->setText("192.168.43.163");
ui->label_Port->setText(QString::number(Port));
ui->label_status->setText("运行中!");
}
void MainWindow::on_pushButton_close_clicked() //关闭服务器
{
Server->close();
ui->pushButton_close->setEnabled(false);
ui->pushButton_open->setEnabled(true)
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
opentcs与仿真车辆tcp通信界面.zip (13个子文件)
opentcs-integration-example-master.zip 383KB
useforowncar.xml 43KB
Tcp_Server
Tcp_Server.pro.user.239b165 23KB
Tcp_Server.pro 1KB
mainwindow.h 878B
tcpserver.cpp 1KB
mainwindow.cpp 9KB
tcpserver.h 1019B
main.cpp 183B
mainwindow.ui 11KB
Tcp_Server.pro.user 41KB
tcpsocket.cpp 1KB
tcpsocket.h 668B
共 13 条
- 1
资源评论
qq_20826539
- 粉丝: 3
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功