全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3153
推到 Plurk!
推到 Facebook!

mscomm接收大於char(128) 會出現問題

 
joycat
一般會員


發表:4
回覆:6
積分:2
註冊:2004-02-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-11-21 13:58:43 IP:59.125.xxx.xxx 未訂閱
 
根據以上的資料 有說些解決方式,
問題2 MScomm 在接收時 就已經拋掉一些資料了
希望在接收端得到预期的0-255之间的数据,结果却是:前129个数据接收正确,为0-128,后面127个数据为126个0和一个255,
造成这种给果的原因在于中文Windows使用的是双字节字符集(DBCS)系统。DBCS系统使用0-128之间的数字表示ASCII字符,
大于128的数字仅作为前导字符,它只是显示是一个非拉丁语系的字符,而并不代表实际意义。上述程序在调用CHR()
函数时用到了DBCS字符集,冈此产生了此类错误。那么,如何发送人于128的数据呢?
答案是使用字符数组



小弟在BCB底下 ,嘗試使用OleVariant 來接資料 (MSComm1->Input 在BCB底下的資料型態是OleVariant )
但是還是沒辦法克服問題...
下列兩狀況 都是 發送端 發送 AA 01 01 31
狀況1:
設定BINARY接收:
MSComm1->InputMode=1;
MSComm1->ParityReplace="";
收到的 資料 會是 '\x01\x01' 資料 好像被 拋掉了
狀況2:
設定String 接收:
MSComm1->InputMode=0;
MSComm1->ParityReplace="?";
收到的 資料 會是 '?\x011' <== 用HEX 看 是 "63 63 63 01 31"
其中 char 大於128的部分 會被replace掉
如果 MSComm1->ParityReplace=""; 則 仍然不會 收到 正確的資料
[code]
void __fastcall TForm1::MSComm1Comm(TObject *Sender)
{
int i;
char char_tmp;
rec_str="";
int BfCount,rbLen ;
OleVariant varRxBuff;
BfCount= MSComm1->InBufferCount ;
if(MSComm1->InBufferCount>0)
{
varRxBuff=MSComm1->Input; // 用BCB 去看內容 已經是 少了些東西了
rec_buff=varRxBuff.AsType(varString);
rbLen= rec_buff.Length();
for(i=0; i < rec_buff.Length() 1 ;i ){
char_tmp = *(rec_buff.SubString(i,1).c_str()) ;
rec_str =rec_str "[" IntToStr(char_tmp) " " int(char_tmp) " " IntToHex(int(char_tmp),2) "] " ;
}
RichEdit1->Lines->Add(DateTimeToStr(Now())
" HEX:" rec_str );
}
}
[/code]


jcjroc
高階會員


發表:21
回覆:279
積分:115
註冊:2002-09-18

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-01-14 12:44:48 IP:60.248.xxx.xxx 訂閱
自己用API寫寫不就一切問題都不存在了嗎???

系統時間:2024-04-20 23:51:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!