serialPort.Write(msg, 0, msg.Length);
請教一下,使用serialPort向電腦自帶的com1寫資料,為什么會卡死。
.我下載了網上的一些串口除錯助手,有的寫入會卡死,有的可以繼續正常操作,請問怎么能解決這個問題。
uj5u.com熱心網友回復:
通過com口寫資料,卡死?只是通過特定com口向外接設備傳資料,怎么會卡死呢?有沒有捕獲例外?uj5u.com熱心網友回復:
還是你接收資料的執行緒有問題?uj5u.com熱心網友回復:
COM1實際沒有接線。我這邊需要的是向多個com發送資料,其中有一個會給出正確反饋;就是找出這個正確的串口。
但是一旦發給com1這種沒有接外設的會卡死在寫資料這一條,不知道怎么解決。
uj5u.com熱心網友回復:
你可以在通過try{}catch{}處理如果報例外說明沒有外接設備,在處理例外的時候直接忽略掉就可以了,沒有報例外的說明就是正確的串口uj5u.com熱心網友回復:
這個COM1不會報例外,只會卡死在寫入資料的那一行,程式不往下走也不報例外。
uj5u.com熱心網友回復:
using System;using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Ports;
namespace ConsoleApp4
{
class Program
{
private static SerialPort laserPort;
static void Main(string[] args)
{
Program program = new Program();
program.Open("COM1");
laserPort.Write("msg");
laserPort.Close();
Console.WriteLine("OK");
Console.ReadLine();
}
public bool Open(string name, Int32 baudRate = 9600, Int16 dataBits = 8,
StopBits stopBits = StopBits.One, Parity parity = Parity.None)
{
try
{
if (null == laserPort)
{
laserPort = new SerialPort();
}
if (laserPort.IsOpen)
{
laserPort.Close();
}
laserPort.PortName = name;
laserPort.BaudRate = baudRate;
laserPort.DataBits = dataBits;
laserPort.StopBits = stopBits;
laserPort.Parity = Parity.None;
laserPort.ReadBufferSize = 4096;
laserPort.ReadTimeout = 1000; //讀超時
laserPort.Open();
return true;
}
catch
{
return false;
}
}
}
}
請問是怎么一回事,這個COM1是一般電腦上自帶的,有的電腦可能有多個。資料一寫COM1就卡死了。
uj5u.com熱心網友回復:
如果你往有外接設備上發送沒有問題的話,就沒有問題,打開串口就是這樣寫的,不明白你那邊沒有外設,怎么會有串口顯示呢?
uj5u.com熱心網友回復:
1.既然是檢測多個com的狀態,那么肯定不能把檢測流程寫在主執行緒中否則一旦某個com有問題,主執行緒就被阻塞了。
建議把檢測代碼放到執行緒中去,這樣就不會影響主執行緒的處理
2.laserPort.Open();
這句話是有可能拋例外的
return true;
感覺邏輯上不太合適
uj5u.com熱心網友回復:
電腦都自帶一個com1 ,沒用過,你去SerialPort.GetPortNames()應該會拿到這個COM1以及其他的接入外設;現在的情況是:我接了幾個外設,例如RS485通信之類的。現在就是需要在這幾個COM中找到我需要的,所以我向所有的COM依次發通信指令,但是指令一發給COM1 就石沉大海了,也不報錯也不繼續往下跑了。我想知道這是怎么回事。上面那段代碼你可以斷點測驗看看,到了 laserPort.Write("msg");就沒下文了。
uj5u.com熱心網友回復:
開一個執行緒給沒有外設的串口發送資訊,如果沒有在規定時間內接收到回傳資訊,就abort()掉執行緒;至于會死機這個問題應該是系統的機制吧,多等一會時間會不會超時?uj5u.com熱心網友回復:
這是我想到的一個排除沒有外接com口的方法,你可以查下有沒有其他的方法共同學習uj5u.com熱心網友回復:
放在執行緒處理,執行緒堵塞的確不會影響主執行緒,但是COM1還是處于這種堵塞狀態,對于COM1這種問題有什么好的解決辦法嗎?難道使用SerialPort去寫就會這樣么?
uj5u.com熱心網友回復:
好的,回頭我在試試。
uj5u.com熱心網友回復:
task<bool> check串口(cancentoken token)TaskCompletionSource<bool> 異步回傳封裝
token.注冊(p=>{超時回傳false})
try
{
await 串口.open
await 串口.send()
串口.Revice().where(p=>應答正確).訂閱處理(p=>{
異步回傳封裝.trysetvalue(true);
token.cancel();
},token)
}
catch
{
異步回傳封裝.trysetvalue(fasle);
}
看的懂就看,這些東西不能解釋。一解釋就廢口水,水一多,摸魚的就來了。你未必撿著魚到,會讓水淹死
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/46362.html
標籤:C#
上一篇:調式不會命中斷點
