使用C及VB均無法對RS232進行控制,求解

我最近在搞通訊控制,但在XP上面卻無法進行對RS232及Print Port的控制,不知為何系統無法透過現有的Com1及Com2還有Print Port進行控制,我試過使用TC搭配下列程式碼及使用VB都無法成功控制,把RX,TX兩條線對調也無法使用使用XP的終端機程式也沒抓到訊號,我是懷疑XP 把我的控制訊號擋掉啦,不過沒辦法實際測試出來,麻煩各位懂RS232及PrintPort控制的專家們,提供專業的資訊及參考成事碼參考,MSDN的我查過了,不過看不懂他寫啥密,我目前只會用TC進行低階控制那種簡單的模式,VC那種複雜的控制模式我搞不懂,求會著專家指點一下吧。

/* SE1.C rs232 */

/* PC <--> 8051 RS232 COM1 <9600> */

#define op outportb

#define ip inportb

#include <bios>

#include <stdio>

/*-----------------------------*/

main()

{

unsigned char c;

init_232();

clrscr();

puts("---------------------------------------");

puts("SE1.EXE PC RS232 COM1 <9600> ");

puts("---------------------------------------");

while(1)

{

/* check any valid data in */

c=ip(0x3fd);

if( (c & 0x01)== 0x01)

{ c=ip(0x3f8); printf("%c",c); }

/* check user key in */

if( kbhit() )

{

c=getch();

switch(c)

{

case ' ':

clrscr();

puts("--------------------------------------");

puts("SE1.EXE PC RS232 COM1 <9600>");

puts("--------------------------------------");

break;

case 27 : exit(0); break;

default : printf("%c", c);

tx(c);

break;

}

}

}

}

/*---------------------------------------------*/

init_232()

{

op(0x3fb, 0x80);

op(0x3f8, 0x0c);

op(0x3f9, 0 );

op(0x3fb, 0x03);

op(0x3fc, 0x02);

op(0x3f9, 0 );

}

/*----------------------------------------------*/

/* in 3fd bit1=1 have data in from 3f8 */

char rx()

{

char in;

while(1)

{

if(kbhit()) { getch(); break; }

in=ip(0x3fd);

if( (in & 0x01)== 0x01)

{ in=ip(0x3f8); return(in); }

}

}

/*---------------------------------------*/

/* in 3fd bit5=1 o/p to 3f8 */

tx(char c)

{

char in;

while(1)

{

in=ip(0x3fd);

if( (in & 0x20)== 0x20 )

{ op(0x3f8, c); break; }

}

}

/*-------------------------------------------*/

已更新項目:

寶哥~不是VB的難不難問題,事因為VB的使用方式跟檔案存取我用不慣`,效率又不高,雖然有其他方式可以提高效率,但是VB程式我用不太習慣(手上的VB對RS232的程式百試不順才重新想辦法從VC及TC下手),在其他電腦上使用穩定性也不太高,TC那種直接對暫存器的存取跟嵌入式的寫法比較像我用比較習慣,因為MSDN提供的那個VC範例我看不懂怎麼去接收資料跟丟資料(頭也很痛其實我要的功能不多只要可以讓我開啟關閉然後照上面那種範例可使透過2個函式來進行接收跟丟資料就好了,MSDN寫成那樣玩全部知道怎麼改)

2 個已更新項目:

直接透過Porttalk執行

或者把Porttalk 的程式碼加入自己程式裡面??

3 個已更新項目:

我知道那是獨立程式,但是在進行運作的時候還是會有不該有的問提,我有下載他的原始碼研究,是想把它跟自己的程式做結合,在去處理,如果VB寫的程式也可以直接進行RS232通訊的控制,那我可能會想用VB在試看看。

4 個已更新項目:

嗯嗯,昨天跟阿旺大大聯絡上,這部分問題已解決,再來等看看有沒有其他高手有更好的解決方式

4 個解答

評分
  • 1 0 年前
    最佳解答

    Windows XP 不允許 User Application 跳過 Kernel 直接存取 I/O port, 避免資源衝突。這是一種作業系統保護,對大多數使用者來說可以增加系統穩定避免錯誤程式造成系統當機。但相對提供了 Serialport 跟 MSCOMM的函式庫給使用者,你硬是要拿DOS下的 TC 來找碴,那不是自討苦吃嗎?

    還是花點心思去學新軟體吧~ 不然以後就沒解囉~

    還好 XP是 NT base 下 還有方法啦~

    前輩留下了個 porttalk ,可以讓你寫的程式透過它直接存取I/O port , 詳細資料請參考他的網頁http://www.beyondlogic.org/porttalk/porttalk.htm

    下載後,解開執行,記得要有 administrator權限才可以,不然會有問題。

    不過, VB/ VC MSDN 中都有通訊範例程式,只有幾十行,就只是 OPEN / CLOSE 真有那麼難嗎??

    2008-04-19 14:39:42 補充:

    那你試試 Porttalk 好了~~ 還蠻簡單的

    2008-04-20 17:10:34 補充:

    看一下 porttalk 說明吧 ! 那是獨立程式.

    2008-04-21 10:09:46 補充:

    VB 裡面有標準的 RS232 通訊函式庫,你可以試試看, 不會很難~~

    唯一難懂的是 錯誤處理吧~ 如果你不介意 可以先跳過倒是。

  • 1 0 年前

    阿旺大大是否能提供更深入說明呢,該死的XP都會亂檔一堆需要的存取,我能想到的大概也是XP亂檔我的存取,可是網路上有的程式卻能在XP上存取,可是我找不到相關的資料,我本身不管用VB或是C去純曲都有問題,

    VC提供的範例我不知道該怎麼改才能像我上面提供的那種簡單方式來存取。

  • 阿明
    Lv 5
    1 0 年前

    outportb(0x3fb, 0x80); 這些直接對硬體通訊埠存取指令,只能使用真實模式dos作業系統, XP是32位元保護模式多工作業系統,不能使用outportb(0x3fb, 0x80);

  • ㄚ旺
    Lv 5
    1 0 年前

    你直接control port 在 windows protect mode 中,我不知道是否這就是"不行"的原因

    我之前寫過是直接 open "com1" "prn" file 方式,且是可行的

    你要不換一個方式試試,可能管用

還有問題?馬上發問,尋求解答。