最近在與三菱PLC(FX3U)通信時用到了RS485通信(用485轉232轉換器連接到PC串口埠上),
PLC發送資料為(0x0A 0x06 0x00 0x01 0x00 0x01 0x18 0xB1),
在測驗時,碰到以下問題:
1.用串口助手可以正常收到PLC發出的資料,但是用c#寫的串口功能,始終收不到資料(注冊的DataReceived事件始終沒有觸發)。
2.嘗試不注冊DataReceived事件,改用回圈主動讀取(對應以下Scan方法代碼),能夠獲取到_serialPort.BytesToRead=8,但是讀到的資料都是無效資料(0x3F 0x3F 0x3F 0x3F 0x3F 0x3F 0x3F 0x3F)。
在論壇查了一些類似問題后,嘗試在初始化時分別將DTREnable和RTSEnable設定為True,但是測驗下來沒有效果。
如果有朋友了解或碰到這個問題,還請不吝指教,您的建議或許可以幫我解決這個大問題。
以下為相關代碼:
//串口初始化
public void Initialize()
{
_serialPort.PortName = "COM1";
_serialPort.BaudRate = 19200;
_serialPort.DataBits = 8;
_serialPort.StopBits = StopBits.Two;
_serialPort.Parity = Parity.Odd;
_serialPort.ReadTimeout = 3000;
_serialPort.WriteTimeout = 3000;
//嘗試分別將RtsEnable和DtrEnable設定為True,但是沒有效果
//_serialPort.RtsEnable = true;
//_serialPort.DtrEnable = true;
//_serialPort.Handshake = Handshake.None;
_serialPort.ReadBufferSize = 8;
_serialPort.ReceivedBytesThreshold = 1;
_serialPort.DataReceived -= CommDataReceived;
_serialPort.DataReceived += CommDataReceived;
_serialPort.Open();
}
//資料監聽
private void CommDataReceived(Object sender, SerialDataReceivedEventArgs e)
{
int len = _serialPort.BytesToRead;
Byte[] readBuffer = new Byte[len];
_serialPort.Read(readBuffer, 0, len);
}
//主動讀取資料
private void Scan()
{
while (true)
{
int len = _serialPort.BytesToRead;
//在主動讀取時,能夠獲取到len為8,但是讀到的資料為無效資料(0x3F 0x3F 0x3F 0x3F 0x3F 0x3F 0x3F 0x3F)
if (len >= 8)
{
Byte[] readBuffer = new Byte[len];
_serialPort.Read(readBuffer, 0, len);
}
Thread.Sleep(30);
}
}
uj5u.com熱心網友回復:
補充一下,在測驗時,在本機(PC端)配置虛擬串口對(COM3-COM4),通過虛擬的串口之間,可以正常接收到資料。uj5u.com熱心網友回復:
在本PC虛擬串口除錯可以的傳輸,說明可以接收。用正式設備獲取不了,可以看下波特率等等這些的配置是不是對的。
因為串口的代碼就一些配置,然后打開串口而已,沒有其他的了。
uj5u.com熱心網友回復:
看看,波特率,停止位設定是否正確至于你用8作為判定條件,然后說資料不對。這個邏輯有問題,stream是連續的,而且讀到了就移除了,所以如果是8+8,前讀3被扔掉,后讀9你認為不對,其實他是對的
uj5u.com熱心網友回復:
_serialPort.BaudRate = 19200;_serialPort.DataBits = 8;
_serialPort.StopBits = StopBits.Two;
_serialPort.Parity = Parity.Odd
確認這些引數設定和串口助手一致嗎?
串口助手的默認設定不是這樣的,是不是設定了校驗位后,接收的資料校驗失敗導致沒有進入接收處理函式?
uj5u.com熱心網友回復:
截圖你的串口助手工具的設定引數來看看uj5u.com熱心網友回復:
這個遇到過,時間過去太久了。好像是跟硬體相關。有的不支持USB插口。uj5u.com熱心網友回復:
配置引數確認過,和設備保持一致
uj5u.com熱心網友回復:
引數的配置和串口助手保持一致,設備發送的也是同一條指令,但是串口助手能夠正常接收,但是自己寫的功能無法正常接收
uj5u.com熱心網友回復:
https://blog.csdn.net/chenhongwu666/article/details/40142513?utm_medium=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-1.nonecase&depth_1-utm_source=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-1.nonecase試下這個呢
uj5u.com熱心網友回復:
你下位機是不是設定了接收到換行符才給上位機發送資料?如果是這樣的話,上位機發送指令時要在后面加換行符'\r',
串口除錯助手是默認勾上了這個選項的
uj5u.com熱心網友回復:
之前遇到過同事出現過這個問題,你看下是不是你的serialPort物件new了兩次轉載請註明出處,本文鏈接:https://www.uj5u.com/net/231916.html
標籤:C#
上一篇:原來asp.net mvc接收引數很自由,升core后,感覺復雜好多了,能設定跟以前一樣嗎
下一篇:"不存在具有鍵“tas_CustomerInfo”的“IEnumerable<SelectListItem>”型別的 ViewData 項。"}
