C#串口編程 操作硬件


-------通過USB將硬件連接PC, 更新USB驅動,使用下面方法可控制相關設備。

 

//1聲明一個串口對象
public static SerialPort MainModule_Port_ = new SerialPort();
//2給串口設置參數
CreateSerialPort(MainNode.MainModule_Port_, comboBox2.Text.Trim(), "9600", "2");
//3設置參數方法
/// <summary>
/// 公共創建串口
/// </summary>
/// <param name="SP">串口對象</param>
/// <param name="SerialPortName">串口名</param>
/// <param name="BaudRate">波特率</param>
/// <param name="Parity">校驗位</param>
public void CreateSerialPort(SerialPort SP, string SerialPortName, string BaudRate, string Parity)
{
try
{
//串口屬性類
//SerialPortParamter app = new SerialPortParamter();
SP.PortName = SerialPortName;//串口號
SP.BaudRate = Convert.ToInt32(BaudRate);//波特率
SP.Parity = StringToParity(Parity);//校驗位
SP.DataBits = 8;//數據位
SP.StopBits = StringToStopBits("1");//解析停止位
//SP = app.setParatemer();
SP.DtrEnable = true;
SP.RtsEnable = true;
}
catch (Exception ex)
{
MessageBox.Show("創建串口失敗!" + SerialPortName);
}
}
//3.1串口屬性校驗位
public static System.IO.Ports.Parity StringToParity(string parity)
{
if (string.IsNullOrEmpty(parity))
{
return System.IO.Ports.Parity.None;
}
return (System.IO.Ports.Parity)Enum.Parse(typeof(System.IO.Ports.Parity), parity);
}
//3.2串口屬性停止位
public static System.IO.Ports.StopBits StringToStopBits(string stopBits)
{
if (string.IsNullOrEmpty(stopBits))
{
return System.IO.Ports.StopBits.None;
}
return (System.IO.Ports.StopBits)Enum.Parse(typeof(System.IO.Ports.StopBits), stopBits);
}
//////////目前已經創建好了一個串口,下面用來發送指令,下面為16進制的645協議
string mess="68 19 00 00 19 67 37 68 91 08 33 33 34 33 33 35 34 35 d7 16";
byte[] messArray=StrSplitToByte(mess);
MainNode.MainModule_Port_.Write(messArray, 0, messArray.Length);//從串口發送協議,正常會將發送或收到幀保持到一個集合,供展示
///字符串 轉 byte 數組
public static byte[] StrSplitToByte(string inSplitString)
{
string[] byteStrings;
byteStrings = inSplitString.Split(" ".ToCharArray());
byte[] byteOut;
byteOut = new byte[byteStrings.Length];
for (int i = 0; i < byteStrings.Length; i++)
{
if (string.IsNullOrEmpty(byteStrings[i]))
{
continue;
}
byteOut[i] = Convert.ToByte(byteStrings[i], 16);
}
return byteOut;
}
//////////////發送了協議 ,我們希望得到回復,下面為如何接收協議
//接收幀方法,1376.2協議測試
private void __RecvThread_Agreement_13762()
{
while (1 == 1)
{
try
{
if (MainNode.MainModule_Port_.IsOpen)
{
int iReadSize = MainNode.MainModule_Port_.BytesToRead;
if (iReadSize == 0)
{
Thread.Sleep(10);
continue;
}
byte[] readBuffer = new byte[iReadSize];
MainNode.MainModule_Port_.Read(readBuffer, 0, iReadSize);
//該方法是將接收的幀,在方法中根據幀格式進行判斷,正確后放入同發送一起的集合中。
ProcessRecvData(readBuffer);//處理接收數據
}
}
catch (Exception e) { ;}
}
}

///////////////////////////////下面是算幀的校驗位的方法
/// <summary>
/// 更新校驗碼645
/// 參數無需" "分隔
/// </summary>
public static string UpdateCS645(string baowen)
{
baowen = baowen.Trim();
string[] mess = null;// AnalysisMessage.separate(baowen, 2).Split(' ');
if (baowen.Trim().IndexOf(' ') == -1)
{
mess = AnalysisMessage.separate(baowen, 2).Split(' ');
}
else
{
mess = baowen.Split(' ');
}

int cs = 0;
for (int i = 0; i < mess.Length; i++)
{
cs += Convert.ToInt32((HexConvert.BCDstrToBin(mess[i])), 2);
}
string csV = HexConvert.Mess10to16((cs % 256).ToString());
if (csV.Length == 2)
return csV;
else if (csV.Length == 4)
return csV.Substring(2, 2);
return csV.Substring(1, 2);
}
/// <summary>
/// 更新校驗碼1376.2
/// </summary>
public static int UpdateCS(byte[] bs)
{
int cs = 0;
for (int i = 3; i < bs.Length - 2; i++)
{
cs += bs[i];
}
return cs;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM