怎样用delphi写一个程序来读取从串口读取来的数据,并显示出来。

怎样用delphi写一个程序来读取从串口读取来的数据,并显示出来。,第1张

Comm1CommName := 'com1';

  Comm1BaudRate := 4800;//波特率每个机器都不一样

  Comm1Parity := TParity(2);

  Comm1ByteSize := TByteSize(2);

  Comm1StopBits := TStopBits(2);

  Comm1StartComm;    //开始记得结束哦

以上代码在formshow里面写

然后写下面的过程

procedure Tfrm_cnc_h_edtComm1ReceiveData(Sender: TObject; Buffer: Pointer;

  BufferLength: Word);

var str: string;

begin

  editClear;

  SetLength(Str, BufferLength);

  move(buffer^, pchar(@Str[1])^, bufferlength);

 editText := trim(Str);// 这里显示到你要的edittext

  sendmessage(edt_measurehandle, wm_keydown, vk_return, 0);

end;

最后在formclose 里面写上

Comm1StopComm;  //comm1结束

控件在system这里面找跟手电筒一样的那个就是

代码你可以复制,便宜你了。

你先看看串口线有没问题:

将串口的2、3脚两根针短接,用键盘在串口调试输入字符,如果串口调试接收区能够显示输入的字符,说明串口工作正常

等我再看看程序

我觉得这儿有问题 JBC TI,SEND

JBC在T1为0的时候,会顺序执行,然后就end了 ,这里我觉得应该改为等待发送结束的指令

JNB T1, $

没有接收到数据

1、如果串口调试助手HEX和字符模式的窗口没有显示内容,那么说明串口没有接收到数据,单片机程序和数据线两个方面分别检查一下。

2、试试不同的串口助手或者不同版本,有时候是你串口助手自身可能出现了问题。先把USB转TTL模块的RX和TX短接,自测一下,全屏到处看一下设置部分,有无可疑之处,即可解决。

因为你打开串口后程序里的延时改变了,造成屏幕时序不匹配

你如果是调用了串口子程序造成的,那么建议你重新写一下那个子程序,用非延时的方法。

建议下载个串口监视软件,参数设置里port选好端口,软件会记录下该端口所有收发数据,看数据对不对。数据对的话,说明串口调试助手有问题;数据错的话,说明单片机有问题。

C#串口读写程序方法具体如下:

PortDataSendcs 发送Class

using System;

using SystemCollectionsGeneric;

using SystemText;

namespace IOCPTestBaseC

{

public class PortDataSend

{

Declare#region Declare

private long mCount = 0;

private int mDataLength = 0;

private byte[] BS = null;

#endregion Declare

PortDataSend#region PortDataSend

public PortDataSend()

{

}

public PortDataSend(byte[] pBS, int pDataLength)

{

BS = pBS;

mDataLength = pDataLength;

}

#endregion PortDataSend

DataSend#region DataSend

public void DataSend()

{

try

{

if (BS == null)

{

return;

}

if (mDataLength == 0)

{

mDataLength = BSLength;

}

if (mDataLength == 0)

{

return;

}

mDataLength = mDataLength + 2;

byte[] BST = new byte[mDataLength];

BST[BSTLength - 2] = 0x00;

BST[BSTLength - 1] = 0x03;

for (int i = 0; i < BSLength; i++)

{

BST[i] = BS[i];

BST[BSTLength - 2] = (byte)(BST[BSTLength - 2] ^ BS[i]);

}

IOCPTestBaseCGlobeValuesSPWrite(BST, 0, BSTLength);

mCount++;

mDataLength = 0;

}

catch

{

}

}

#endregion DataSend

mCount#region mCount

public long GetCount

{

get

{

return mCount;

}

}

#endregion mCount

DataSendTest3#region DataSendTest3

public void DataSendTest3()

{

try

{

byte[] BSTest;

string[] mBSStr = ConvertToString("01 02 03 01 00 3A 02 03 31 31 31 31 31 31 31 31 31 31 31 31 2C 00 01 2C 00 64 3B 32 32 32 32 32 32 32 32 32 32 32 32 2C 00 01 2C 00 64 3B 33 33 33 33 33 33 33 33 33 33 33 33 2C 00 01 2C 00 64 3B")Split(' ');

BSTest = new byte[mBSStrLength];

for (int i = 0; i < BSTestLength; i++)

{

BSTest[i] = (byte)ConvertToInt32(mBSStr[i], 16);

}

BS = BSTest;

DataSend();

}

catch

{

}

}

#endregion DataSendTest3

}

}

PortDataReceivedcs 接收Class

using System;

using SystemCollectionsGeneric;

using SystemText;

namespace IOCPTestBaseC

{

class PortDataReceived

{

Declare#region Declare

private long mCount = 0;

private int mDataEnd = 0;

private byte[] BR = new byte[2048];

private byte[] BRTmp = new byte[2048];

private byte mSOH = 0x01; //通讯特殊字符定义:通讯字头

private byte mSTX = 0x02; //通讯特殊字符定义:数据开始

private byte mETX = 0x03; //通讯特殊字符定义:通讯结束

#endregion Declare

PortDataReceived#region PortDataReceived

public PortDataReceived()

{

}

#endregion PortDataReceived

Listen#region Listen

public byte[] Listen()

{

try

{

byte[] BR = ReceiveData();

return BR;

}

catch (NullReferenceException NullEx)

{

throw NullEx;

}

catch (Exception ex)

{

throw ex;

}

}

#endregion Listen

ReceiveData#region ReceiveData

public byte[] ReceiveData()

{

try

{

int mStartCount = 0;

int mSOHPos = 0;

int mSTXPos = 0;

int mETXPos = 0;

int mCmdLength = 0;

SystemDateTime DT = SystemDateTimeNow;

byte[] Data = null;

BRTmp = new byte[2048];

while((SystemDateTimeNowTicks - DTTicks) < IOCPTestBaseCGlobeValuesPortTimeOut)

{

try

{

mStartCount = 0;

//SystemThreadingThreadSleep(IOCPTestBaseCGlobeValuesPortDelay);

mStartCount = IOCPTestBaseCGlobeValuesSPRead(BRTmp, 0, 2048);

for (int i = 0; i < mStartCount; i++)

{

BR[i + mDataEnd] = BRTmp[i];

}

mDataEnd = mDataEnd + mStartCount;

}

catch

{

}

if (mStartCount > 0)

{

DT = SystemDateTimeNow;

}

//寻找并且校验SOH、STX、ETX的位置

for (int i = 0; i < BRLength - 6; i++)

{

if((BR[i] == mSOH) && (BR[i+6] == mSTX))

{

mSOHPos = i;

mSTXPos = i+6;

mCmdLength = (int)BR[i+4] 256 + (int)BR[i+5];

mETXPos = mSTXPos + mCmdLength + 2;

if (BR[mETXPos] == mETX)

{

Data = new byte[mSTXPos + mCmdLength + 1 - mSOHPos];

for (int j = 0; j < mSTXPos + mCmdLength + 1 - mSOHPos; j++)

{

Data[j] = BR[mSOHPos + j];

}

for (int j = 0; j < (mDataEnd - (mSTXPos + mCmdLength + 1)); j++)

{

BR[j] = BR[(mSTXPos + mCmdLength + 1) + j];

}

for (int j = (mDataEnd - (mSTXPos + mCmdLength + 1)); j < 2048; j++)

{

BR[j] = 0x00;

}

mDataEnd = mDataEnd - (mSTXPos + mCmdLength + 1);

IOCPTestBaseCGlobeValuesDataBufferAdd(Data);

mCount++;

return Data;

}

}

}

}

return null;

}

catch (NullReferenceException NullEx)

{

throw NullEx;

}

catch (Exception ex)

{

throw ex;

}

}

#endregion ReceiveData

ReceiveDataNonReturn#region ReceiveDataNonReturn

public void ReceiveDataNonReturn()

{

try

{

ReceiveData();

}

catch

{

}

}

#endregion ReceiveData

ReceiveDataThread#region ReceiveDataThread

public void ReceiveDataThread()

{

try

{

while (true)

{

try

{

ReceiveData();

}

catch

{

}

}

}

catch

{

}

}

#endregion ReceiveData

mCount#region mCount

public long GetCount

{

get

{

return mCount;

}

}

#endregion mCount

}

}

DataProcessingIOCPcs 处理Class

using System;

using SystemCollectionsGeneric;

using SystemText;

namespace IOCPTestBaseC

{

public class DataProcessingIOCP

{

Declare#region Declare

private long mCount = 0;

#endregion Declare

DataProcessingIOCP#region DataProcessingIOCP

public DataProcessingIOCP()

{

}

#endregion DataProcessingIOCP

DataProcessing#region DataProcessing

public void DataProcessing()

{

try

{

int mCurrentBuffer = 0;

while (true)

{

byte[] RD = null;

提取正待处理的数据#region 提取正待处理的数据

if (IOCPTestBaseCGlobeValuesDataBuffer != null)

{

if (IOCPTestBaseCGlobeValuesDataBufferCount > 0)

{

if (mCurrentBuffer < 0)

{

mCurrentBuffer = 0;

}

RD = (byte[])IOCPTestBaseCGlobeValuesDataBuffer[mCurrentBuffer];

mCurrentBuffer++;

}

else

{

continue;

}

}

else

{

continue;

}

#endregion 提取正待处理的数据

数据处理#region 数据处理

switch (RD[3]) //指令处理

{

case 0x01:

ReadData_0X01(RD);

break;

case 0x02:

ReadData_0X02(RD);

break;

}

#endregion 数据处理

处理结束,删除已经处理了的数据#region 处理结束,删除已经处理了的数据

if (IOCPTestBaseCGlobeValuesDataBuffer != null)

{

if (IOCPTestBaseCGlobeValuesDataBufferCount > 0)

{

IOCPTestBaseCGlobeValuesDataBufferRemove(RD);

}

}

mCurrentBuffer--;

if (mCurrentBuffer < 0)

{

mCurrentBuffer = 0;

}

#endregion 处理结束,删除已经处理了的数据

mCount++;

}

}

catch

{

}

}

#endregion DataProcessing

mCount#region mCount

public long GetCount

{

get

{

return mCount;

}

}

#endregion mCount

ReadData_0X01#region ReadData_0X01

private void ReadData_0X01(byte[] pRD)

{

try

{

try

{

if (pRD[3] != 0x01)

{

return;

}

string[] mSampleCode = new string[pRD[7]];

int[] mTesterType = new int[pRD[7]];

int[] mLoadCapacity = new int[pRD[7]];

for (int i = 0; i < pRD[7]; i++)

{

for (int j = 0; j < 12; j++)

{

mSampleCode[i] = mSampleCode[i] + ConvertToString(ConvertToChar(pRD[8 + j + i 19]));

}

mTesterType[i] = pRD[i 19 + 21] 255 + pRD[i 19 + 22];

mLoadCapacity[i] = pRD[i 19 + 24] 255 + pRD[i 19 + 25];

}

return;

}

catch (Exception Ex)

{

throw Ex;

}

}

catch

{

}

}

#endregion ReadData_0X01

ReadData_0X02#region ReadData_0X02

private void ReadData_0X02(byte[] pRD)

{

try

{

try

{

if (pRD[3] != 0x02)

{

return;

}

int[] mData = new int[pRD[7]];

string mSampleCode = "";

for (int i = 0; i < 12; i++)

{

mSampleCode = mSampleCode + ConvertToString(ConvertToChar(pRD[8 + i]));

}

for (int i = 0; i < mDataLength; i++)

{

mData[i] = pRD[i 2 + 20] 255 + pRD[i 2 + 21];

}

}

catch (Exception Ex)

{

throw Ex;

}

}

catch

{

}

}

#endregion ReadData_0X02

ReadData_0X02_Request#region ReadData_0X02_Request

private void ReadData_0X02_Request(byte[] pRD)

{

try

{

try

{

if (pRD[3] != 0x02)

{

return;

}

int[] mData = new int[pRD[7]];

string mSampleCode = "";

for (int i = 0; i < 12; i++)

{

mSampleCode = mSampleCode + ConvertToString(ConvertToChar(pRD[8 + i]));

}

for (int i = 0; i < mDataLength; i++)

{

mData[i] = pRD[i 2 + 20] 255 + pRD[i 2 + 21];

}

}

catch (Exception Ex)

{

throw Ex;

}

}

catch

{

}

}

#endregion ReadData_0X02_Request

}

}

以上就是关于怎样用delphi写一个程序来读取从串口读取来的数据,并显示出来。全部的内容,包括:怎样用delphi写一个程序来读取从串口读取来的数据,并显示出来。、stc单片机串口调试的小程序,但是在串口调试助手里,显示接收不到数据,希望大虾们帮忙解决下,下面是程序、串口调试助手窗口不显示内容等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10142538.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存