[問題] about rs232

看板ASM (組合語言)作者 (RICO)時間15年前 (2009/09/24 05:26), 編輯推噓7(7014)
留言21則, 4人參與, 最新討論串1/1
我最近正在做RS232與89S51的相關傳輸。 我想請問一下 我在發送端 丟一個字串 過去 給89S51 然後89S51 再傳回給我PC ㄧ個字串(程式內這樣設定的... 可是 我在PC的回傳值顯示上看到卻是 31 13 10(hex) 49 D A(10) 為何傳回值是 3 個字元 是因為他協定的關係嗎? 那我實際上傳給89S51我的傳送也都會附加 'D' 'A' 這2個字元嗎? 我丟的是字串才對 而回傳的也是字串(puts("1")); 太久沒摸C = =|| 可是又多了一個問題如果我使用 puts('1'); 我只接收到 D A ???? 網路的RS232文獻都沒有相關說明! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.33.51.36

09/24 06:29, , 1F
電腦端用什麼程式??會不會是'CR'跟'LF'換行字元
09/24 06:29, 1F

09/24 10:36, , 2F
同意樓上,應該是你送了三個字元過去
09/24 10:36, 2F

09/24 11:03, , 3F
sorry..我打錯...那應該是10進位制而非ASCII...
09/24 11:03, 3F
※ 編輯: laevatain103 來自: 114.33.51.36 (09/24 11:04) ※ 編輯: laevatain103 來自: 114.33.51.36 (09/24 11:05)

09/24 11:06, , 4F
我之前有查過ascii碼 D A 的確是CR LF 這協定內定的?
09/24 11:06, 4F

09/24 12:18, , 5F
你Windows程式的問題,把換行給送出去了
09/24 12:18, 5F

09/24 12:33, , 6F
那傳回的值應該是ㄧ個字元才對(51寫死的...
09/24 12:33, 6F
※ 編輯: laevatain103 來自: 140.128.142.122 (09/24 13:47)

09/24 18:50, , 7F
你直接把TX和RX對接,這樣你windows程式送啥就會收到啥
09/24 18:50, 7F

09/24 18:51, , 8F
先確認windows程式可以送一個字元後再接回8051看結果
09/24 18:51, 8F

09/24 23:02, , 9F
直接拿線來接嗎?= =|| 感覺蠻刺激的
09/24 23:02, 9F

09/25 02:24, , 10F
RS232對接測試很正常啊……
09/25 02:24, 10F
我做了對接後發現並無有 CR LF 我做了一些簡單的測試 8051(CODE) PC(接收資料顯示以10進位表示) puts("1"); 49 13 10 puts('2'); 13 10 printf("3"); 51 printf('4'); link: http://imgur.com/1NPcz
(有圖有真相) 從以上來推測 應該是 puts(); 此函數所自動附加的! ※ 編輯: laevatain103 來自: 114.33.51.36 (09/30 20:44) ※ 編輯: laevatain103 來自: 114.33.51.36 (09/30 20:45)

09/30 23:55, , 11F
最好是可以並個示波器看波型最準
09/30 23:55, 11F

09/30 23:55, , 12F
puts這個函式如果不是你寫的,最好去查一下用法
09/30 23:55, 12F

10/01 00:19, , 13F
puts() 是內建的~我正在找相關文件= =
10/01 00:19, 13F
我在C51 compiler的文件中找到 int puts (const char *string); Description: The puts function writes string followed by a newline character (‘\n’) to the output stream using the putchar function. ※ 編輯: laevatain103 來自: 114.33.51.36 (10/01 00:35)

10/01 00:58, , 14F
以上只能解釋為什麼有LF..我現在還找不到未啥有CR
10/01 00:58, 14F

10/01 01:37, , 15F
一般M$系統字串'\n'就是解釋為"\n\r"而UNIX上才是只有\n
10/01 01:37, 15F

10/01 01:38, , 16F
Keil C裡面的內定putchar採用的是看到\n就自動加上\r
10/01 01:38, 16F

10/01 01:39, , 17F
而標準的C函式中puts 是會自動加上\n的,而puts一般都是
10/01 01:39, 17F

10/01 01:39, , 18F
透過 putchar來傳送文字的。所以你的問題是由puts跟putch
10/01 01:39, 18F

10/01 01:41, , 19F
ar 兩個函式合力構成的,要修正這個問題可以到C51的LIB
10/01 01:41, 19F

10/01 01:42, , 20F
目錄中把putchar.c拿出來改
10/01 01:42, 20F

10/01 01:50, , 21F
樓上高手
10/01 01:50, 21F
感謝樓上大大門~真是讓我受益良多! 應該是 \r\n 而不是 \n\r 相信你一定手誤了吧XD New line, UNIX中代表ASCII 10(十進位), DOS(Windows)系統中則是ASCII 13 + ASCII 10(十進位). 參考 link: http://ind.ntou.edu.tw/~dada/cgi/Perlsynx.htm (使用搜尋關鍵字UNIX會把較容易找到) ※ 編輯: laevatain103 來自: 114.33.51.36 (10/01 02:22) ※ 編輯: laevatain103 來自: 114.33.51.36 (10/01 02:24)
文章代碼(AID): #1AkfA8s2 (ASM)
文章代碼(AID): #1AkfA8s2 (ASM)