RS232 for USB/notes

Mac OS X 平台上程式設計的相關問題討論

版主: bryanchangdigdog謝孟叡

內容
發表人
KK Chang
新生訓練中
文章: 12
註冊時間: 09/28/2005 1:11 am

#21 文章 KK Chang »

rlong 寫:如果電腦都沒出現錯誤訊息那就要檢查硬體接線了

用示波器檢查輸出端是否有訊號輸出?

輸出的 2,3,5 腳是否接到輸入的 3,2,5 腳?

建議參考Apple的範例,執行一下

kernResult = FindModems(&serialPortIterator);
result = GetModemPath(serialPortIterator);
IOObjectRelease(serialPortIterator); // Release the iterator.

以取得正確的 Path 並且確認他們的存在,才去 OpenSerialPort( )。
各位先進你好,小弟目前是使用 KeySpan USA19-HS,在使用 Apple sample code 取得 path 時,取到的結果是
Modem found with BSD path: /dev/cu.Bluetooth-Modem
Error opening serial port /dev/cu.Bluetooth-Modem - Resource busy(16).
但是我要用的 path 應該要是 /dev/tty.KeySerial1 ,這是 KeySpan 的公用程式帶出來的路徑,這該怎麼解決呢?

:roll:
KK Chang
新生訓練中
文章: 12
註冊時間: 09/28/2005 1:11 am

#22 文章 KK Chang »

Dannier 寫:謝謝!

已經解決了因為我的RS232接腳接錯了...真不好意思

可是問題又來了

我把程式寫成cocoa後發現

我不能用while loop 因為這樣彩球會狂轉 久了就變成沒有回應了

請問是用 startPeriodicEvents 嗎? 可是我不知道要怎麼利用

我對cocoa的event還不是很了解

還是有別的方法可以讓cocoa 程式可以一直做某件事而不會hang住

抱歉因為我對 cocoa 的知識也很一知半解

感謝高手的指點!!
我參考了Dannier 大大的 code , 再加上 NSTimer 目前有連到 serial port 上,
但是讀到的資料卻是錯的,可以請各位幫我看看問題在哪嗎??

連線條件 : 9600,7,N,2,Non-flow control

int fd, res;
struct termios oldtio, newtio;
char buf[256];

printf("Start Open Serial ...\n");
fd = open(RS232Path, O_RDWR|O_NOCTTY|O_NONBLOCK);

if (fd < 0)
printf("Serial Open Fail...\n");
perror(RS232Path);
serialopen = FALSE;
exit(1);
}
else {
printf("Serial Open OK ...\n");

tcgetattr(fd, &oldtio);
bzero(&newtio, sizeof(newtio));
newtio.c_cflag = BaudRate|CS7|CLOCAL|CREAD|HUPCL|CSTOPB;
newtio.c_iflag = IGNPAR;
newtio.c_oflag = 0;
newtio.c_lflag = ICANON;
tcflush(fd, TCIFLUSH);
tcsetattr(fd, TCSANOW, &newtio);
serialopen = TRUE;

printf("Reading...\n");
}

- (void) handleTimer: (NSTimer *) timer
{

int xx;
printf("Timer Run.....\n");

if (serialopen) {
res = read(fd, buf, 256);
buf[res]=0;

printf("res=%d buf=%s\n", res, buf);

for (xx=0; xx<res; xx++)
printf("res=%d,buf=%x\n", xx, buf[xx]);

if (buf[0] == 0) printf("Empty! ");

for (xx=0; xx<256; xx++)
buf[xx]=0;
}
}

*********** Debug view *************
Timer Run.....
res=48 buf=б\240\263\261\261\273\263\266\263\273\263\262\256\262\215б\240\263\261\261\273\263\266\263\273\263\262\256\262\215б\240\263\261\261\273\263\266\262\273\263\262\256\262\215
res=0,buf=ffffffd0
res=1,buf=ffffffb1
res=2,buf=ffffffa0
res=3,buf=ffffffb3
res=4,buf=ffffffb1
res=5,buf=ffffffb1
res=6,buf=ffffffbb
res=7,buf=ffffffb3
res=8,buf=ffffffb6
.......
***********************************
以 ZTerm 獲得的正確的資料是 P1 311;363;32.1 這種格式~


:?
頭像
rlong
嗜冰客
文章: 1530
註冊時間: 04/30/2001 1:01 am
來自: 新竹
聯繫:

#23 文章 rlong »

KK Chang 寫: 各位先進你好,小弟目前是使用 KeySpan USA19-HS,在使用 Apple sample code 取得 path 時,取到的結果是
Modem found with BSD path: /dev/cu.Bluetooth-Modem
Error opening serial port /dev/cu.Bluetooth-Modem - Resource busy(16).
但是我要用的 path 應該要是 /dev/tty.KeySerial1 ,這是 KeySpan 的公用程式帶出來的路徑,這該怎麼解決呢?

:roll:
GetModemPath(io_iterator_t serialPortIterator) 所抓到的 bsdPath[] 是一個 Array 不是單一 String, 你所顯示的是 Array 中的第一個成員 char *bsdPath[0]

往往一部電腦不只一個 RS232 。 :shock:
I love OPERA !
KK Chang
新生訓練中
文章: 12
註冊時間: 09/28/2005 1:11 am

#24 文章 KK Chang »

rlong 寫:
KK Chang 寫: 各位先進你好,小弟目前是使用 KeySpan USA19-HS,在使用 Apple sample code 取得 path 時,取到的結果是
Modem found with BSD path: /dev/cu.Bluetooth-Modem
Error opening serial port /dev/cu.Bluetooth-Modem - Resource busy(16).
但是我要用的 path 應該要是 /dev/tty.KeySerial1 ,這是 KeySpan 的公用程式帶出來的路徑,這該怎麼解決呢?

:roll:
GetModemPath(io_iterator_t serialPortIterator) 所抓到的 bsdPath[] 是一個 Array 不是單一 String, 你所顯示的是 Array 中的第一個成員 char *bsdPath[0]

往往一部電腦不只一個 RS232 。 :shock:
我查了一會,我發現應該是要變更查詢的 service,才能查到我要的 KeySerial,
目前我先直接指定 bsdPath 跳過這問題,這樣做已經可以連到儀器了。
:)
目前我比較頭痛是為何獲得資料的 ASCII 字串,看起來都是錯誤的,但是確定
有連上設備,因為儀器的 remote 關掉,資料也就跟著停了,現在必較擔心是
不是起始的 RS232 設定就錯了,因為 Mac OS 所提供的狀態參數非常多,我
試了很久但還是找不出來,因為我連接的儀器只用到2、3、7 這幾隻腳,太多
的參數反而讓我有點亂,還請大家幫我指點一下迷津了~
;)
頭像
rlong
嗜冰客
文章: 1530
註冊時間: 04/30/2001 1:01 am
來自: 新竹
聯繫:

#25 文章 rlong »

KK Chang 寫: newtio.c_cflag = BaudRate|CS7|CLOCAL|CREAD|HUPCL|CSTOPB;

:?
CS7 改成 CS8 試試,BaudRate 也是很重要的須與你的儀器相同。
I love OPERA !
KK Chang
新生訓練中
文章: 12
註冊時間: 09/28/2005 1:11 am

#26 文章 KK Chang »

Update 一下狀況~
我搜尋了國外的網站討論,發現他們用 AMSerialTest 在寫 Serial Port,
所以我也抓下來試試,但是跟我遇到的問題一樣,接收到的資料變成亂碼
反之 ZTerm 則不會,所以現在困擾中~~
:roll:
KK Chang
新生訓練中
文章: 12
註冊時間: 09/28/2005 1:11 am

#27 文章 KK Chang »

自己再上來 update 一下~
問題解決了 .....
結果是 encode 的問題,一般我們用的 ASCII 是 7 位元的,我不清楚為何
Mac OS 會用 8 位元來處理,後來我是用另一台 NB 傳送一些字元過來,才
發現這些 data 都固定大了一定數值,所以後來再加上 AND 0x7F 之後就解
決了,感謝各位的指導~

:D
Dannier
新生訓練中
文章: 7
註冊時間: 04/05/2008 10:19 pm
來自: 中央大學

#28 文章 Dannier »

不好意思~問個笨問題
AND 0x7F
請問要加在哪?
XD
KK Chang
新生訓練中
文章: 12
註冊時間: 09/28/2005 1:11 am

#29 文章 KK Chang »

Dannier 寫:不好意思~問個笨問題
AND 0x7F
請問要加在哪?
XD
因為傳進來的 data 放在 buf 中,所以要使用資料前就先對 buf 的每個 byte 作
去掉第八個 bit 的動作( AND 0x7F)
回覆文章