C# serialPort的DataReceived事件無法觸發 ,用的霍尼韋爾的掃碼槍並且裝了相應的USB轉串口驅動。

來源:互聯網
上載者:User

標籤:今天   cat   霍尼韋爾   append   item   out   tab   log   焦點   

昨天想試試霍尼韋爾的掃碼槍,掃碼槍有兩種模式,鍵盤模式和串口模式,

1、鍵盤模式直接插上就行了,就像一個鍵盤一樣不需要任何驅動,掃出來的資料直接落到PC的輸入焦點上。就像一個鍵盤一樣,只能輸入字元。

2、而串口模式,則是安裝驅動以後,能夠虛擬成一個COM口,

如果我們用掃碼槍給應用程式輸入資料的時候肯定是不行的,因為程式需要能夠在後台啟動並執行時候也能用掃碼槍作為資料輸入的。這就需要用串口模式了。

今天我寫程式的時候,問題是怎麼也不能觸發,DataReceived事件,最後發現問題所在,幾個要點

1、串口必須New新執行個體,必須和能夠正確擷取硬體串口的名稱。

2、sp.ReceivedBytesThreshold = 1; 這個是預設值就是1,就是有一個位元組的資料就觸發事件。

3、sp.RtsEnable = true;sp.DtrEnable = true;這兩個屬性必須得正確設定,哈

我就是因為第3個原因一直不不能正確觸發事件。記得添加事件綁定代碼啊。

 

public partial class Form1 : Form
{
SerialPort sp;
bool bIsReading = false;
// Dynamic d = new Dynamic();

public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
bool b = false;
try
{
sp = new SerialPort();
sp.BaudRate = 115200;
sp.DataBits = 8;
sp.Parity = Parity.None;
sp.StopBits = StopBits.One;
sp.PortName = System.IO.Ports.SerialPort.GetPortNames()[0];

sp.RtsEnable = true;
sp.DtrEnable = true;
sp.ReadTimeout = 3000;
sp.ReceivedBytesThreshold = 1;
sp.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.sp_DataReceived_1);
// sp.DataReceived += Sp_DataReceived;
// sp.DataReceived -= Sp_DataReceived;
sp.Open();


}
catch (Exception xe)
{
b = true;
MessageBox.Show("異常:" + xe.Message);

}
finally {
if (sp != null && b == true)
{
if (sp.IsOpen)
{
sp.Close();

} else
{
sp = null;
}

}

b = false;
}

}

 

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{

//sp.DiscardInBuffer();
if (sp != null)
{
sp.Close();
sp.Dispose();
}
}

private void sp_DataReceived_1(object sender, SerialDataReceivedEventArgs e)
{


if (bIsReading == true)
return;
bIsReading = true;
try
{
StringBuilder currentline = new StringBuilder();
//迴圈接收資料
while (sp.BytesToRead > 0)
{
char ch = (char)sp.ReadByte();
currentline.Append(ch);
}
//在這裡對接收到的資料進行處理
MessageBox.Show("資料為:" + currentline.ToString());

//GlobalPublic.BasePublic.ShowMessage("資料為:" + currentline.ToString(), (BaseFrm as BaseForm.FrmBaseDoc).MTC_oGlobal);
//InvokeDelegate del = new InvokeDelegate(setItem);
//this.BeginInvoke(del, currentline.ToString());
//setItem(currentline.ToString());
// currentline = new StringBuilder();
}
catch (Exception ex)
{
MessageBox.Show("異常:" + ex.Message);
}
finally
{
bIsReading = false;
}
}
}
}

C# serialPort的DataReceived事件無法觸發 ,用的霍尼韋爾的掃碼槍並且裝了相應的USB轉串口驅動。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.