Major Member
加入日期: Feb 2004 您的住址: 貧民窟
文章: 198
|
RS-232接收連續資料造成系統嚴重負擔
想請教一下目前在研究上遇到的問題
現在需要透過RS-232接收資料 再傳送開始命令後 資料是連續不斷的傳送 接收到電腦後再進行儲存以及分析計算 直到傳送停止命令後才會停止傳送 目前發現在資料透過RS-232傳送時會讓CPU處於100%的運算 連帶造成資料儲存及計算錯誤 想請教一下有沒有哪位高手知道怎麼解決這問題 |
|||||||
2009-01-13, 05:45 PM
#1
|
*停權中*
加入日期: Aug 2008 您的住址: BLM
文章: 89
|
RS-232 的流量不大 , 相較於現在各種通訊協定來講 ,
幾乎不足以重視 . 或許你可以朝 RS-232 使用的 IRQ , 有沒有和其他裝置的 IRQ 有所衝突這方向來檢查一下 . 其餘的部分 , 我就無法知道了 . |
||
2009-01-14, 11:43 AM
#2
|
Advance Member
加入日期: Jun 2000 您的住址: 新北市的邊緣
文章: 452
|
接收端硬體? 作業系統? 用主機板原生的232還是用USB轉232?
設備端往PC端送的資料量每秒多少byte? baud rate? 如果是PC平台且是微軟OS, 用內建的超級終端機試試看 或是把code貼上來.
__________________
http://211.72.51.216:8080/ |
2009-01-14, 12:35 PM
#3
|
Major Member
加入日期: Feb 2004 您的住址: 貧民窟
文章: 198
|
目前有用到的兩台系統
主要: G1S 作業系統:Vista 使用晶片為PL-2303的USB轉RS-232 次要: 實驗室電腦(單核賽揚2G) 作業系統:XP 主機板原生RS232 實驗設備是一個感測器 鮑率為57600 輸出Binary的數值資料 一組資料內有起始標計及結束標計 在起始標計及結束標記中間的值是我要的資料 假設起始資料是0x01而結束標記為0x02 他傳送的資料如下 "0x01"+"data"+...+"data"+"0x02"+"0x01"+"data"+"data"+....... 像這樣不間斷重傳送 資料還會分成MSB以及LSB傳送 所以收到後還要組合才能成為有用的資料 之前用過XP的超級終端機測試 在連續接收資料時CPU負擔為100% 因為資料還需淤要計算 我PC端是使用VC++2008的WindowsFrom來寫接收程式 目前遇到的問題是 在接收的資料理會出現不正確的值 例如正確值範圍是(-511)~(511)但卻出現512635 出現位置則是不一定 可能出現在第2500筆,也可能在第100筆資料較出現
__________________
CPU:P4-2.6CG MB:GA-8I865PE TW RAM:創見DDR400 512+256MB*2 VGA:MSI FX5900XT VTD128 音效卡:X-FI XtremeMusic PSU:海韻S12-430W DVD燒錄機:BenQ 1620pro(04年11月製...保佑別出事) 燒錄機:Lite-On LTC-48161H CASE:火焰蜘蛛 喇叭:Logitech Z-5300 螢幕:CMV CT-726D 電視卡:Compro T300 |
2009-01-14, 02:39 PM
#4
|
Advance Member
加入日期: Jun 2000 您的住址: 新北市的邊緣
文章: 452
|
我有遇過USB轉232(485)的轉換器太差(Driver寫的不好)
在單核心CPU下的XP收送資料正常, 在雙核CPU下的XP就會掉資料, 建議你換一顆converter試試看(找找看有沒有AFDI chip and driver 的) 然後是code, 57600不算快, 你可以嘗試用Win32 API去寫code把資料先寫到log file裡面, 看看效率如何. 微軟的.Net 雖然好用易學, 但是個人覺得是個黑箱, 裡面做了啥麼使用者沒有辦法掌握.
__________________
http://211.72.51.216:8080/ |
2009-01-14, 02:59 PM
#5
|
Major Member
加入日期: Feb 2004 您的住址: 貧民窟
文章: 198
|
引用:
請問您是說FTDI嗎? 我在Y拍只搜尋到這個 沒搜尋到AFDI 除了Y拍能找到的以外不知道有沒有其他推薦的? 台北光華能買到的更好 這個可以報帳,在光華附近比較好處理 這部分處理比較簡單...先試試看 Win32 API 對我來說是沒接觸過的領域 可能得花很多時間來學這個 當初用.Net的確是因為比較好學 也許以後有機會會再更深入研究 這部分的東西還滿好玩的 此文章於 2009-01-14 09:58 PM 被 dragon30 編輯. |
|
2009-01-14, 09:51 PM
#6
|
*停權中*
加入日期: Jan 2008
文章: 160
|
速度太快~~
|
2009-01-16, 10:09 PM
#7
|
Basic Member
加入日期: Jul 2002 您的住址: 台北
文章: 25
|
一般來說,.NET的串列效率沒有那麼差,我案子都是用胞率115200了,你應該檢查你的串列程式寫法,看是不是有BUG或是用到效率很差的方法,導致CPU負載100%
|
2009-01-17, 09:56 AM
#8
|
Major Member
加入日期: Feb 2004 您的住址: 貧民窟
文章: 198
|
引用:
其實 我也在想是不是我的程式效率太差造成的 我現在也只是算會寫 但離寫得好還有一大段路要走 我把我的程式附上來好了 希望各位能給我一些意見 看看怎麼寫可以讓執行效率更好 以下程式是用VC++ 2008 Windows Form 架構寫的 僅擷取 SerialPort 接收部分 =================================== private: System::Void SerialPort_1_DataReceived(System::Object^ sender,System::IO::Ports::SerialDataReceivedEventArgs^ e) { ser_data_00 = ser_data_01; ser_data_01 = ser_data_02; ser_data_02 = ser_data_03; ser_data_03 = ser_data_04; ser_data_04 = ser_data_05; ser_data_05 = ser_data_06; ser_data_06 = ser_data_07; ser_data_07 = ser_data_08; ser_data_08 = ser_data_09; ser_data_09 = ser_data_10; ser_data_10 = ser_data_11; ser_data_11 = ser_data_12; ser_data_12 = ser_data_13; ser_data_13 = SerialPort_1->ReadByte(); if((ser_data_00 == 65)&(ser_data_13 == 90)){ A_data = (((ser_data_01*256)+ser_data_02)-512); B_data = (((ser_data_03*256)+ser_data_04)-512); C_data = (((ser_data_05*256)+ser_data_06)-512); D_data = (((ser_data_07*256)+ser_data_08)-512); E_data = (((ser_data_09*256)+ser_data_10)-512); F_data = (((ser_data_11*256)+ser_data_12)-512); data_cnt = data_cnt + 1; Data_Matrix->A_m[data_cnt] = A_data; Data_Matrix->B_m[data_cnt] = B_data; Data_Matrix->C_m[data_cnt] = C_data; Data_Matrix->D_m[data_cnt] = D_data; Data_Matrix->E_m[data_cnt] = E_data; Data_Matrix->F_m[data_cnt] = F_data;} } =================================== 接收到的資料儲存到A_m,B_m....的矩陣內 此文章於 2009-01-19 08:20 PM 被 dragon30 編輯. |
|
2009-01-19, 08:16 PM
#9
|
Basic Member
加入日期: Jul 2002 您的住址: 台北
文章: 25
|
你用C語言寫,請善用指標,不要一個BYTE進來就把全部資料搬一遍,這很花CPU資源,用指標去指定資料要放的位置....當收到起始封包65後才開始用指標將兩兩一組的對應資料計算後放至暫存記憶體(A_data~F_data)(這時就應該邊收資料邊做資料合併),當收到第13個結束封包時判斷是否為90,是就把暫存區(A_data~F_data)搬到陣列中,結束封包錯誤就捨棄剛放進來的資料。
把要做的事情分散,CPU資源負載就輕多了,也可以使用多執行序寫法去改善人機介面的反應。 |
2009-01-20, 12:53 AM
#10
|