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单片机串口调试的小程序,但是在串口调试助手里,显示接收不到数据,希望大虾们帮忙解决下,下面是程序、串口调试助手窗口不显示内容等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)