PCDVD數位科技討論區
PCDVD數位科技討論區   註冊 常見問題 標記討論區為已讀

回到   PCDVD數位科技討論區 > 其他群組 > 疑難雜症區
帳戶
密碼
 

回應
 
主題工具
dragon30
Major Member
 

加入日期: Feb 2004
您的住址: 貧民窟
文章: 198
RS-232接收連續資料造成系統嚴重負擔

想請教一下目前在研究上遇到的問題

現在需要透過RS-232接收資料

再傳送開始命令後

資料是連續不斷的傳送

接收到電腦後再進行儲存以及分析計算

直到傳送停止命令後才會停止傳送

目前發現在資料透過RS-232傳送時會讓CPU處於100%的運算

連帶造成資料儲存及計算錯誤

想請教一下有沒有哪位高手知道怎麼解決這問題
     
      
舊 2009-01-13, 05:45 PM #1
回應時引用此文章
dragon30離線中  
A ROD
*停權中*
 

加入日期: Aug 2008
您的住址: BLM
文章: 89
RS-232 的流量不大 , 相較於現在各種通訊協定來講 ,
幾乎不足以重視 .
或許你可以朝 RS-232 使用的 IRQ , 有沒有和其他裝置的 IRQ
有所衝突這方向來檢查一下 .

其餘的部分 , 我就無法知道了 .
 
舊 2009-01-14, 11:43 AM #2
回應時引用此文章
A ROD離線中  
小貓貓
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
回應時引用此文章
小貓貓離線中  
dragon30
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
回應時引用此文章
dragon30離線中  
小貓貓
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
回應時引用此文章
小貓貓離線中  
dragon30
Major Member
 

加入日期: Feb 2004
您的住址: 貧民窟
文章: 198
引用:
作者小貓貓
我有遇過USB轉232(485)的轉換器太差(Driver寫的不好)
在單核心CPU下的XP收送資料正常, 在雙核CPU下的XP就會掉資料, 建議你換一顆converter試試看(找找看有沒有AFDI chip and driver 的)

述刪...


請問您是說FTDI嗎?
我在Y拍只搜尋到這個
沒搜尋到AFDI
除了Y拍能找到的以外不知道有沒有其他推薦的?
台北光華能買到的更好
這個可以報帳,在光華附近比較好處理
這部分處理比較簡單...先試試看

Win32 API 對我來說是沒接觸過的領域
可能得花很多時間來學這個
當初用.Net的確是因為比較好學
也許以後有機會會再更深入研究
這部分的東西還滿好玩的

此文章於 2009-01-14 09:58 PM 被 dragon30 編輯.
舊 2009-01-14, 09:51 PM #6
回應時引用此文章
dragon30離線中  
cmchang_fs
*停權中*
 

加入日期: Jan 2008
文章: 160
速度太快~~
舊 2009-01-16, 10:09 PM #7
回應時引用此文章
cmchang_fs離線中  
edison72
Basic Member
 

加入日期: Jul 2002
您的住址: 台北
文章: 25
一般來說,.NET的串列效率沒有那麼差,我案子都是用胞率115200了,你應該檢查你的串列程式寫法,看是不是有BUG或是用到效率很差的方法,導致CPU負載100%
舊 2009-01-17, 09:56 AM #8
回應時引用此文章
edison72離線中  
dragon30
Major Member
 

加入日期: Feb 2004
您的住址: 貧民窟
文章: 198
引用:
作者edison72
一般來說,.NET的串列效率沒有那麼差,我案子都是用胞率115200了,你應該檢查你的串列程式寫法,看是不是有BUG或是用到效率很差的方法,導致CPU負載100%


其實
我也在想是不是我的程式效率太差造成的
我現在也只是算會寫
但離寫得好還有一大段路要走
我把我的程式附上來好了
希望各位能給我一些意見
看看怎麼寫可以讓執行效率更好

以下程式是用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
回應時引用此文章
dragon30離線中  
edison72
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
回應時引用此文章
edison72離線中  


回應


POPIN
主題工具

發表文章規則
不可以發起新主題
不可以回應主題
不可以上傳附加檔案
不可以編輯您的文章

vB 代碼打開
[IMG]代碼打開
HTML代碼關閉



所有的時間均為GMT +8。 現在的時間是07:35 AM.


vBulletin Version 3.0.1
powered_by_vbulletin 2024。