標籤:
1.等待用戶端串連的時候,catch{}內不要編寫異常處理,否則報錯;
2.線上程中對別的控制項進行操作,要使用委託,否則引起衝突;(或者new thread)
//將串連上的用戶端顯示在List中,跨線程委託處理 delegate void SetListBoxCallback(string str); public void SetListBox(string str) { if (listBoxClient.InvokeRequired) { SetListBoxCallback setListCallback = new SetListBoxCallback(SetListBox); listBoxClient.Invoke(setListCallback, str); } else { listBoxClient.Items.Add(str); } }
3.關於協助,使用平台內建的HelpProvider不行(未解決問題),可以使用keydown()事件。
if(e.KeyCode==Keys.F1) { System.Diagnostics.Process.Start("iexplore.exe", strPath); }
4.CRC16校正,modbus中低位在前,高位在後
public byte[] CRC16_C(byte[] data)
{
byte CRC16Lo;
byte CRC16Hi; //CRC寄存器
byte CL; byte CH; //多項式碼&HA001
byte SaveHi; byte SaveLo;
byte[] tmpData;
int I;
int Flag;
CRC16Lo = 0xFF;
CRC16Hi = 0xFF;
CL = 0x01;
CH = 0xA0;
tmpData = data;
for (int i = 0; i < tmpData.Length; i++)
{
CRC16Lo = (byte)(CRC16Lo ^ tmpData[i]); //每一個資料與CRC寄存器進行異或
for (Flag = 0; Flag <= 7; Flag++)
{
SaveHi = CRC16Hi;
SaveLo = CRC16Lo;
CRC16Hi = (byte)(CRC16Hi >> 1); //高位右移一位
CRC16Lo = (byte)(CRC16Lo >> 1); //低位右移一位
if ((SaveHi & 0x01) == 0x01) //如果高位位元組最後一位為1
{
CRC16Lo = (byte)(CRC16Lo | 0x80); //則低位位元組右移後前面補1
} //否則自動補0
if ((SaveLo & 0x01) == 0x01) //如果LSB為1,則與多項式碼進行異或
{
CRC16Hi = (byte)(CRC16Hi ^ CH);
CRC16Lo = (byte)(CRC16Lo ^ CL);
}
}
}
byte[] ReturnData = new byte[2];
ReturnData[0] = CRC16Lo; //CRC低位
ReturnData[1] = CRC16Hi; //CRC高位
return ReturnData;
}
5.TCP發送報文到下位機時,發送的是十六進位位元組數組,需要在發送的時候將字串轉化為十六進位位元組資料。
6.由於涉及多用戶端的串連,使用定時器迴圈掃描是否有串連接入。
7.驗證是否為數字,是否為浮點數時,使用正則式驗證。
string regexftext = @"^(-?\d+)(\.\d+)?$";
Regex regexfloat = new Regex(regexftext, RegexOptions.None);
regexfloat.IsMatch(StrAvePrice.Trim();
C# TCP充電樁參數設定工具編寫總結