导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
2004/2/5 10:41:23
标题:
请教一个和单片机连接串口传输数据的问题。
浏览:3669
加入我的收藏
楼主:
日前想用做DELPHI做一个跟数据采集卡(单片机)串口数据传输的程序,用SPCOMM控件通信,遇到了两个问题,还望大家赐教。 第一,传输数据的类型问题,我在程序中是直接发送的string类型的数据,但是数据采集卡接受到的是ascii码,或者是其他什么码,反正接收不到正常的数据。 第二,使用第三者开发的串口调试程序,通过16进制发送的时候,单片机可以正常接收数据,但是单片机发送的数据的时,串口调试程序如果设定为ASCII码时,无法接收数据,或者接收的数据无法显示。如果设为16进制接收的话,接收后显示的数据有误差。
----------------------------------------------
-
作者:
2004/2/5 10:59:13
1楼:
不懂。。我来顶,学习,学习。 呵呵~~一点想法。单片机接收什么类型的数据你就转成什么数据发给它.
----------------------------------------------
-
作者:
bios (阿贡)
★☆☆☆☆
-
盒子中级会员
2004/2/5 11:04:00
2楼:
学习
----------------------------------------------
作者:
2004/2/5 11:25:13
3楼:
理论上来讲,我发送的是字符转成的ASCII码,可是因为我用的是SPCOMM,所以从串口发送的具体是什么类型,我也不清楚,但是单片机好像只认识十六进制的数,但我不清楚,我怎样才能把发送的数据改为十六进制。还有就是单片机发送的数据我用SPCOMM接收不到,或者说是接收到了但是不能正常显示,头痛呀。
----------------------------------------------
-
作者:
2004/2/5 11:38:21
4楼:
我急用,在线等,哪位兄弟知道拜托告诉我一声。
----------------------------------------------
-
作者:
2004/2/5 11:43:32
4楼:
串口只能认得ASCII码。所以你必须把String类型转成ASCII码.
----------------------------------------------
-
作者:
2004/2/5 14:56:40
5楼:
如果串口只认识ASCII码的话,是不是单片机也必须得用ASCII传输数据? 但是SPCOMM控件好象已经把STRING类型的数据转成ASCII码了呀。
----------------------------------------------
-
作者:
2004/2/5 15:49:37
6楼:
急呀顶。
----------------------------------------------
-
作者:
2004/2/5 16:10:40
7楼:
说清楚一点嘛,你送给单片机的串,在PC这边的是什么样的串列出一个来; 单片机要的是什么样的数据,也要说明白一点.
----------------------------------------------
-
作者:
2004/2/5 16:29:47
8楼:
给你两个例子帮我分析一下 采用ASCII码发送时 PC发送: 00 01 02 03 04 05 单片机接收为 70 71 72 73 74 75 采用码ASCII接收时: PC能够接收到单片机发送的字节,但是无法显示。我用的TMEMO显示接收内容 采用16进制发送时: 单片机可以正常接收到PC发送的数据。 采用16进制接收时: 单片机发送: 00 01 02 03 04 05 PC接收为: 80 81 82 83 84 85
----------------------------------------------
-
作者:
2004/2/5 16:36:33
9楼:
看样子,象是PC与单片机串口设置的不一样,如数据位长度,停止位,校验等. 波特率象是一样的. 还有一点: 你上面所说的是现象, 还是应该 ? 在TMemo里请把接收到的按每字节转成两位十六进制串显示.
----------------------------------------------
-
作者:
2004/2/5 16:38:17
10楼:
呵,谢谢你提醒了我。 可我不知道怎么把字节转成两位十六进制串,麻烦相告一下。
----------------------------------------------
-
作者:
2004/2/5 16:41:35
11楼:
但是数据位长度,停止位,校验位设置都是相同的呀。
----------------------------------------------
-
作者:
2004/2/5 16:43:19
12楼:
IntToHex(ord( ),2)+' '
----------------------------------------------
-
作者:
bios (阿贡)
★☆☆☆☆
-
盒子中级会员
2004/2/5 16:43:39
11楼:
先求没个字节的ASI码 而后inttohex函数转成十六进制字符串
----------------------------------------------
作者:
2004/2/5 16:51:21
13楼:
to 楼主: 在startcomm之前加上下面的几条,(只有一条真正有用,是哪条,我不知,呵呵) with COMM1 do begin Outx_CtsFlow:=False; Outx_DsrFlow:=False; DtrControl:=DtrEnable; DsrSensitivity:=False; TxContinueOnXoff:=False ; Outx_XonXoffFlow:=False; Inx_XonXoffFlow:=False; end;
----------------------------------------------
-
作者:
2004/2/5 16:52:04
13楼:
12楼: IntToHex(ord( ),2)+' ' 最后的' '是什么意思?
----------------------------------------------
-
作者:
2004/2/5 16:54:26
14楼:
连成一大片字符,不好看的. 所以用空格隔开.
----------------------------------------------
-
作者:
2004/2/5 17:03:49
15楼:
十万分地感谢bjdribllec和bios可 DtrControl:=DtrEnable;这一条是什么意思呢?
----------------------------------------------
-
作者:
2004/2/5 17:11:12
16楼:
现在又遇到了新的问题 采用16进制接收时: 单片机发送: 30 31 32 33 34 35/ PC接收为: 90 B1 92 B3 B4 95
----------------------------------------------
-
作者:
2004/2/5 17:12:42
16楼:
能编译您就用着,真的,我也不知道是什么意思,需要问small pig组. 通讯成了的话,在这里告诉一声. 别忘了哟!
----------------------------------------------
-
作者:
2004/2/5 17:13:55
15楼:
不知道是不是你的波特率没设对, 我一同学做毕设时也遇到同样的问题,改了波特率就好了
----------------------------------------------
还是很菜,继续努力!
作者:
2004/2/5 17:15:00
17楼:
COMM1.Parity COMM1.ParityCheck 这两项您是怎么设的?
----------------------------------------------
-
作者:
2004/2/5 17:20:43
18楼:
COMM1.Parity:=none; COMM1.ParityCheck:=false; 另外 IntToHex(ord( ),2)+' ' 中的ord()是什么意思?里面的数据类型应该是什么? 还有随便问一下char()的功能是什么?里面的数据类型应该是什么? 通讯成了,我一定把源码奉上。
----------------------------------------------
-
作者:
2004/2/5 17:23:09
19楼:
采用16进制接收时: 单片机发送: 30 31 32 33 34 35/ PC接收为: 90 B1 92 B3 B4 95 这又是什么原因造成的呢?
----------------------------------------------
-
作者:
2004/2/5 17:28:51
20楼:
ord(Buffer^) 是个字节呀. 不看源码也成, 我这PC上的,51上的都有.呵呵, 只是关心是否调通了. for 19楼, 您加了13楼的代码了?
----------------------------------------------
-
作者:
2004/2/5 17:32:23
21楼:
byte类型的可以加吗在ord()吗? 我还没有加上那个代码。因为有错误。让你看一下这一段代码: procedure TFormCommTest.Comm2ReceiveData(Sender: TObject; Buffer: Pointer; BufferLength: Word); type IArr = ^integer; var RevP : array [1..4096] of byte; i : integer; CommRevStr : ShortString; begin SetLength(CommRevStr,BufferLength); Move(IArr(buffer)^,Revp,bufferLength); For i:=1 to BufferLength do begin CommrevStr[i] :=char(inttohex(ord(Revp[i]),2)+' '); end; Memo2.Lines.Add(CommrevStr); StatusBar1.Panels[2].Text := '串口2正在接收数据'; end; 提示这一句有错误,可我不知该怎么 写了。 CommrevStr[i] :=char(inttohex(ord(Revp[i]),2)+' ');
----------------------------------------------
-
作者:
2004/2/5 17:52:30
22楼:
还有,char()的功能是什么?里面的数据类型是什么?
----------------------------------------------
-
作者:
2004/2/5 17:58:23
23楼:
已经是byte了,就不用ord了 CommrevStr:string; CommrevStr:='; For i:=1 to BufferLength do begin CommrevStr:=CommrevStr+inttohex(ord(Buffer^),2)+' '; inc(Buffer); end; Memo2.Lines.Add(CommrevStr); StatusBar1.Panels[2].Text := '串口2正在接收数据'; end;
----------------------------------------------
-
作者:
2004/2/5 18:14:36
24楼:
数据不可兼容。
----------------------------------------------
-
作者:
2004/2/5 18:21:17
25楼:
CommrevStr:=CommrevStr+inttohex(ord(Buffer^),2)+' '; 这一句提示有错误。
----------------------------------------------
-
作者:
2004/2/5 18:22:49
25楼:
怪我! P:PChar; CommrevStr:string; P:=Buffer; CommrevStr:='; For i:=1 to BufferLength do begin CommrevStr:=CommrevStr+inttohex(ord(P^),2)+' '; inc(P); end; Memo2.Lines.Add(CommrevStr); StatusBar1.Panels[2].Text := '串口2正在接收数据'; end; ----- so long. :)
----------------------------------------------
-
作者:
2004/2/6 10:10:16
26楼:
一般串行通信都是使用 ASCII 码的, 但是要看你们是用几根线的 3根还是9根? 如果是9线的可能需要打工 组件的 DTR 与RTS 控制 否则可能收到不数据,或数据变形 波特率不匹配常导致乱码 建议找个好个的串口调试工具来测试一下 这样就可以分清问题出在硬件还是软件 推荐 sscom32 (C++Bulider写的) 这个工具非常不错
----------------------------------------------
作者:
2004/2/6 10:26:02
27楼:
感谢,我调试以后,和以前的效果是一样的。也就是 采用ASCII码发送时 PC发送: 00 01 02 03 04 05 单片机接收为 70 71 72 73 74 75 采用码ASCII接收时: PC能够接收到单片机发送的字节,但是无法显示。我用的TMEMO显示接收内容 采用16进制发送时: 单片机可以正常接收到PC发送的数据。 采用16进制接收时: 单片机发送: 00 01 02 03 04 05 PC接收为: 80 81 82 83 84 85
----------------------------------------------
-
作者:
2004/2/6 10:52:48
28楼:
帮我看一下这段代码有什么问题。 var p:pchar; //RevP : array [1..4096] of byte; i : integer; s : byte; CommRevStr : String; begin p:=buffer; //Move(IArr(buffer)^,Revp,bufferLength); CommrevStr:='; For i:=1 to BufferLength do begin s:=ord(p^); CommrevStr:=CommrevStr+inttostr(s)+' '; inc(p); end; Memo2.Lines.Add(CommrevStr); StatusBar1.Panels[2].Text := '串口2正在接收数据'; ----------------------------------------------
----------------------------------------------
-
作者:
2004/2/6 11:06:38
29楼:
bjdribllec 老兄 你的代码帮了大忙了,现在已经可以用半个字节通信,但是如果发送的数据是一个字节的话,接收就不正常了。 比如单片机发送的是1F,PC接收为190
----------------------------------------------
-
作者:
2004/2/9 9:47:55
30楼:
现在已经可以进行通信了,呵呵,高兴呀。只是还有一个问题没有解决,说给大家听听。 可能是数据缓冲区的问题,我每次接收完一组数据,然后再重新发送的时候,第一次发送的总是最后接收到的数据,晕呀,是程序的问题,还是应该在接收完数据以后将缓冲区清0呢?
----------------------------------------------
-
作者:
2004/2/17 10:23:25
31楼:
请教wanglei916 ,你的以下问题是如何解决的?谢谢! 采用16进制接收时: 单片机发送: 00 01 02 03 04 05 PC接收为: 80 81 82 83 84 85
----------------------------------------------
-