private void WriteByteToSerialPort1(TextBox MyTextBox, TextBox ChanTextBox)
{
try
{
if (Convert.ToByte(MyTextBox.Text) > 200)//为什么是200?
{
textBox15.AppendText("\r\n数据大于200,无效!!\r\n");
MyTextBox.Text = ChanTextBox.Text;
}
else
{
if (true) //单设备
{
//下发
try
{
byte[] Data = new byte[10] { 0x21, 0x22, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00 };
Data[Convert.ToByte(MyTextBox.Tag) + 1] = Convert.ToByte(MyTextBox.Text);
int csum = CheckSumAction(Data,13);
Data[10] = Convert.ToByte(csum);
System.Threading.Thread.Sleep(100);
textBox15.AppendText("[" + DateTime.Now.ToString("HH:mm:ss") + "]" + "发 -> ");
serialPort1.Write(Data, 0, 10);//发送
System.Threading.Thread.Sleep(100);
foreach (byte Member in Data) //遍历用法
{
string str = Convert.ToString(Member, 16).ToUpper();
textBox15.AppendText((str.Length == 1 ? "0" + str : str) + " ");
}
textBox15.AppendText("\r\n");
}
catch
{
textBox15.AppendText("\r\n单设备模式下发错误!!\r\n");
serialPort1.Close();
button7.BackColor = Color.Red;
button2.Text = "打开串口";
}
}
}
}
catch
{
textBox15.AppendText("\r\n数据无效!!\r\n");
MyTextBox.Text = ChanTextBox.Text;
}
}
//-------------------------------发送应答信号给下位机函数
//发送应答信号,参数:串口号,设备号,应答功能号,应答数据,重发次数,超时时间(单位ms)
//如:应答功能号=0xDD,应答数据0x01成功,0x00失败
//超时重发,
//private ushort SendAckToSerialPort(SerialPort MyPort, byte DeviceNum, byte AckFunCodetemp, byte AckType, ushort retrynum, Int16 timeoutset)//AckFunCodetemp
//{
// byte csumtemp=0x00;
// int sumtemp = 0;
// ushort i = 0;
// Program.USART1_RecAckFlag = 0;
// sumtemp = DeviceNum + AckFunCodetemp + AckType + 0x55 + 0x55 + 0x55 + 0x55 + 0x55;
// csumtemp = (byte)(sumtemp % 256);
// byte[] AckTempData = new byte[13] {0x21,0x22,DeviceNum,AckFunCodetemp,AckType,0x55, 0x55, 0x55, 0x55, 0x55, csumtemp, 0x0D, 0x0A };
// for (i = 0; i < retrynum; i++)
// {
// MyPort.Write(AckTempData, 0, 13);
// System.Threading.Thread.Sleep(timeoutset);
// }
// return 1;//没应答,返回0
//}
private ushort SendAckToSerialPort(SerialPort MyPort, byte DeviceNum, byte AckFunCodetemp, byte AckType, ushort retrynum, Int16 timeoutset)//AckFunCodetemp
{
byte csumtemp = 0x00;
int sumtemp = 0;
ushort i = 0;
Program.USART1_RecAckFlag = 0;
sumtemp = DeviceNum + AckFunCodetemp + AckType + 0x55 + 0x55 + 0x55 + 0x55 + 0x55;//AckFunCodetemp=0xDD
csumtemp = (byte)(sumtemp % 256);
byte[] AckTempData0 = new byte [13]{0x21,0x22,DeviceNum,AckFunCodetemp, AckType, 0x55, 0x55, 0x55, 0x55, 0x55, csumtemp, 0x0D, 0x0A };
byte[] AckTempData00 = new byte[1];
AckTempData00[0] = AckTempData0[0];
byte[] AckTempData01 = new byte[1];
AckTempData01[0] = AckTempData0[1];
byte[] AckTempData02 = new byte[1];
AckTempData02[0] = AckTempData0[2];
byte[] AckTempData03 = new byte[1];
AckTempData03[0] = AckTempData0[3];
byte[] AckTempData04 = new byte[1];
AckTempData04[0] = AckTempData0[4];
byte[] AckTempData05 = new byte[1];
AckTempData05[0] = AckTempData0[5];
byte[] AckTempData06 = new byte[1];
AckTempData06[0] = AckTempData0[6];
byte[] AckTempData07 = new byte[1];
AckTempData07[0] = AckTempData0[7];
byte[] AckTempData08 = new byte[1];
AckTempData08[0] = AckTempData0[8];
byte[] AckTempData09 = new byte[1];
AckTempData09[0] = AckTempData0[9];
byte[] AckTempData10 = new byte[1];
AckTempData10[0] = AckTempData0[10];
byte[] AckTempData11 = new byte[1];
AckTempData11[0] = AckTempData0[11];
byte[] AckTempData12 = new byte[1];
AckTempData12[0] = AckTempData0[12];
ushort tt =1;
if (serialPort1.IsOpen)
{
for (i = 0; i < retrynum; i++)
{
serialPort1.Write(AckTempData00, 0, 1); //System.Threading.Thread.Sleep(tt);
serialPort1.Write(AckTempData01, 0, 1);// System.Threading.Thread.Sleep(tt);
serialPort1.Write(AckTempData02, 0, 1);// System.Threading.Thread.Sleep(tt);
serialPort1.Write(AckTempData03, 0, 1);// System.Threading.Thread.Sleep(tt);
serialPort1.Write(AckTempData04, 0, 1); //System.Threading.Thread.Sleep(tt);
serialPort1.Write(AckTempData05, 0, 1);//System.Threading.Thread.Sleep(tt);
serialPort1.Write(AckTempData06, 0, 1); //System.Threading.Thread.Sleep(tt);
serialPort1.Write(AckTempData07, 0, 1); //System.Threading.Thread.Sleep(tt);
serialPort1.Write(AckTempData08, 0, 1);// System.Threading.Thread.Sleep(tt);
serialPort1.Write(AckTempData09, 0, 1);// System.Threading.Thread.Sleep(tt);
serialPort1.Write(AckTempData10, 0, 1);//System.Threading.Thread.Sleep(tt);
serialPort1.Write(AckTempData11, 0, 1); //System.Threading.Thread.Sleep(tt);
serialPort1.Write(AckTempData12, 0, 1);// System.Threading.Thread.Sleep(tt);
}
}
return 1;//没应答,返回0
}
//发送应答信号,参数:串口号, 应答功能码,设备号码,应答成功代码
//如:serialport1---0x12,0x00,0x02
//连续发5次应答信号。每次间隔100ms
// void uart1SendIOCmd(unsigned char ionum,unsigned char IOstatus)
//-------------------------------------------------------------------发送IO信号给下位机函数
private ushort SendIOCmdToSerialPort(SerialPort MyPort, byte DevNumIO,byte FunNumIO, byte IOstatus,ushort retrynum,Int16 timeouttemp)
{
ushort tt =1;
ushort i = 0;
ushort counttemp = 0;
byte csumtemp = 0xFF;
int sumtemp = 0;
sumtemp = DevNumIO + FunNumIO + IOstatus + 0x55 + 0x55 + 0x55 + 0x55 + 0x55;
csumtemp = (byte)(sumtemp % 256);
byte[] AckTempData0 = new byte[13] { 0x21, 0x22, DevNumIO, FunNumIO, IOstatus, 0x55, 0x55, 0x55, 0x55, 0x55, csumtemp, 0x0D, 0x0A };
byte[] AckTempData00 = new byte[1];
AckTempData00[0] = AckTempData0[0];
byte[] AckTempData01 = new byte[1];
AckTempData01[0] = AckTempData0[1];
byte[] AckTempData02 = new byte[1];
AckTempData02[0] = AckTempData0[2];
byte[] AckTempData03 = new byte[1];
AckTempData03[0] = AckTempData0[3];
byte[] AckTempData04 = new byte[1];
AckTempData04[0] = AckTempData0[4];
byte[] AckTempData05 = new byte[1];
AckTempData05[0] = AckTempData0[5];
byte[] AckTempData06 = new byte[1];
AckTempData06[0] = AckTempData0[6];
byte[] AckTempData07 = new byte[1];
AckTempData07[0] = AckTempData0[7];
byte[] AckTempData08 = new byte[1];
AckTempData08[0] = AckTempData0[8];
byte[] AckTempData09 = new byte[1];
AckTempData09[0] = AckTempData0[9];
byte[] AckTempData10 = new byte[1];
AckTempData10[0] = AckTempData0[10];
byte[] AckTempData11 = new byte[1];
AckTempData11[0] = AckTempData0[11];
byte[] AckTempData12 = new byte[1];
AckTempData12[0] = AckTempData0[12];
Program.USART1_RecAckFlag=0;
for (i = 0; i < retrynum; i++)
{
serialPort1.Write(AckTempData00, 0, 1);// System.Threading.Thread.Sleep(tt);
serialPort1.Write(AckTempData01, 0, 1);//System.Threading.Thread.Sleep(tt);
serialPort1.Write(AckTempData02, 0, 1); //System.Threading.Thread.Sleep(tt);
serialPort1.Write(AckTempData03, 0, 1); //System.Threading.Thread.Sleep(tt);
serialPort1.Write(AckTempData04, 0, 1);// System.Threading.Thread.Sleep(tt);
serialPort1.Write(AckTempData05, 0, 1);// System.Threading.Thread.Sleep(tt);
serialPort1.Write(AckTempData06, 0, 1);//System.Threading.Thread.Sleep(tt);
serialPort1.Write(AckTempData07, 0, 1); //System.Threading.Thread.Sleep(tt);
serialPort1.Write(AckTempData08, 0, 1); //System.Threading.Thread.Sleep(tt);
serialPort1.Write(AckTempData09, 0, 1);// System.Threading.Thread.Sleep(tt);
serialPort1.Write(AckTempData10, 0, 1); //System.Threading.Thread.Sleep(tt);
serialPort1.Write(AckTempData11, 0, 1);// System.Threading.Thread.Sleep(tt);
serialPort1.Write(AckTempData12, 0, 1); System.Threading.Thread.Sleep(tt);
while (Program.USART1_RecAckFlag == 0)
{
//20ms计算一次
System.Threading.Thread.Sleep(20);
counttemp++;
if (counttemp >= timeouttemp / 20)//如果超时,跳出循环,再发一次
break;
}
//如果在规定的时间内收到了应答,则直接返回,如果没有应答则继续重发
if (counttemp < timeouttemp / 20)
return 1;
counttemp = 0;
}
return 0;
}
//---------------------------------------------发送浮点数函数
private ushort SendFloatToSerialPort(SerialPort MyPort, byte DevNum,byte FunNum, float FloatTemp,ushort RetryNum, Int16 TimeOutTemp)
{
byte csumtemp = 0xFF;
int sumtemp = 0;
int counttemp = 0;
//将float变为字节
FloatByte = BitConverter.GetBytes(FloatTemp);
//label29.Text = Convert.ToString(FloatByte[0]);//154--------低8位----和单片机的联合体是一样的顺序
//label30.Text = Convert.ToString(FloatByte[1]);//153-----------------所以,先发fb0,fb1,fb2,fb3
//label31.Text = Convert.ToString(FloatByte[2]);//82
//label32.Text = Convert.ToString(FloatByte[3]);//66,十进制---高8位
//发送的初始数据,后面根据传入的数据进行更新
byte[] SendDataTemp = new byte[13] { 0x21, 0x22, DevNum, FunNum, FloatByte[0], FloatByte[1], FloatByte[2], FloatByte[3], 0x55, 0x55, csumtemp, 0x0D, 0x0A };
sumtemp = (SendDataTemp[2] + SendDataTemp[3] + SendDataTemp[4] + SendDataTemp[5] + SendDataTemp[6] + SendDataTemp[7] + SendDataTemp[8] + SendDataTemp[9]) % 256;
csumtemp = (byte)(sumtemp % 256);
SendDataTemp[10] = csumtemp;
try
{
Program.USART1_RecAckFlag = 0;
System.Threading.Thread.Sleep(2);
for (int i = 0; i < RetryNum; i++)
{
MyPort.Write(SendDataTemp, 0, 13);
while (Program.USART1_RecAckFlag == 0)
{
//20ms计算一次
System.Threading.Thread.Sleep(2);
counttemp++;
if (counttemp >= TimeOutTemp / 2)//如果超时,跳出循环,再发一次
break;
}
//如果在规定的时间内收到了应答,则直接返回,如果没有应答则继续重发
if (counttemp < TimeOutTemp / 2)
return 1;
counttemp = 0;
}
return 0;
}
catch
{
MessageBox.Show("串口数据写入发生错误,请检查", "错误");
return 0;
}
}
c#发送数据IO到下位机
最新推荐文章于 2023-11-01 13:32:02 发布