T
tiger_520
Unregistered / Unconfirmed
GUEST, unregistred user!
本人在做一个条屏发送软件,串口控件使用CportLib控件包中的comport控件.厂家提供的通讯协议如下:
1、波特率:9600,8位数据位,无验位,1位停止位
2. 发送信息段格式:开始标志+屏号+日期时间信息+时间显示标志+显示总幕数+方式+显示信息
开始标志(2个字节):0x55,0xaa
屏号(1个字节):0x00-全部, 0x01-1号屏,0x02-2号屏,0x03-3号屏,0x04-4号屏
日期时间(7个字节):year,month,day,hour,min,sec,week
如2003年03月12日10时21分30秒星期四
则时间信息:3、3、12、10、21、30、4(注:星期日为7)
时间显示标志(1个字节)
如果显示时间:标志=0X31
不显示时间:标志=0X30
显示总幕数(1个字节)[barscreennum(0..255幕)]
如果显示总幕数为15数,则barscreennum=15
方式(barscreennum*4个字节,校验位恒为0): 显示方式+消失方式+停留时间+移动速度
for i:=1 to barscreennum do
begin
sendbyte(dispmode); 显示方式(0--11)
sendbyte(hidemode); 消失方式(0--12)
sendbyte(stoptime); 停屏时间(0--255)秒
sendbyte(movespeed); 移动速度(0--9)
end;
注:显示方式:
0-左移入 1-右移入 2-上移入 3-移入 4-左展入 5-右展入
6-上展入 7-下展入 8-横向展开 9-横向闭合
10-纵向展开 11-纵向闭合 12-同时显示
消失方式:
0-左移出 1-右移出 2-上移出 3-移出 4-左展出 5-右展出
6-上展出 7-下展出 8-横向展开 9-横向闭合
10-纵向展开 11-纵向闭合 12-同时消失 13-连续
停留时间:0-255秒
移动速度:0-9,0最快,9最慢
显示信息(barscreennum*ledheight*ledwidth/8个字节,校验位恒为0):
knum:=0;
for i:=1 to barscreennum do
begin
for j:=1 to barheight do //显示屏高:barheight(点)
begin
for k:=1 to barwidth div 8 do //显示屏宽:barwidth/8(点)
begin
sendbyte(sendred[j][k]);
knum:=(knum+1) mod 128;
if knum=0 then delay(40); //每发送128个字节,延迟40ms
end;
end;
end;
//例子
initcom('9600,N,8,1');
delay(1);
sendbyte(0x55);
sendbyte(0xaa);
sendbyte(screenno); //屏号
sendbyte(Year mod 100);
sendbyte(Month);
sendbyte(Day);
sendbyte(Hour);
sendbyte(Min);
sendbyte(Sec);
sendbyte(week);
if disptime=true then sendbyte(0x31)
else sendbyte(0x30);
sendbyte(barscreennum);
for i:=1 to barscreennum do
begin
sendbyte(dispmode);
sendbyte(hidemode);
sendbyte(stoptime);
sendbyte(10*movespeed)
end;
knum:=0;
for i:=0 to barscreennum-1 do
begin
for j:=0 to barheight-1 do
begin
for k:=0 to barwidth div 8-1 do
begin
sendbyte(sendred[j][k]);
knum:=(knum+1) mod 128;
if knum=0 then
begin
delay(40);
end;
end;
end;
end;
主要是通过点阵发送出去.本人写的代码如下:
procedure TForm1.Button4Click(Sender: TObject);
var
i,j,k,x,y,clr,r,g,strcount,knum:integer;
LineBytes,shift,FrameNo,Count,Pos:integer;
TotalBytes:integer;
Buf:array[0..31,0..255] of char;
sendstr:array[0..9] of byte;
mycount:integer;
begin
try
ComPort1.Enabled:=true;
except
end;
for i:=0 to 31 do
for j:=0 to 255 do
begin
buf[i,j]:=char(0);
end;
shift:=$80;
FrameNo:=0; //一直为第一幕
LineBytes:=barwidth div 8;
TotalBytes:=LineBytes * barheight;
Pos:=0;
Count:=0;
r:=0;
g:=0;
shift:=$80;
knum:=0;
if not ComPort1.Connected then
begin
MessageDLG('串口无法初始化,请检查串口连接是否正常.',MtInformation,[mbok],0);
exit;
end;
sendstr[0]:=$55;
sendstr[1]:=$aa;
sendstr[2]:=$01;
sendstr[3]:=$30;
sendstr[4]:=byte(1);
sendstr[5]:=byte(1);
sendstr[6]:=byte(2);
sendstr[7]:=byte(10);
sendstr[8]:=byte(4);
strcount:=length(sendstr);
for i:=0 to strcount-1 do
try
Comport1.WriteStr(chr(sendstr));
except
showmessage('error');
exit;
end;
mycount:=0;
//取到点阵各点的值
for i:=0 to barscreennum-1 do //barscreennum=1 只有一幕
begin
for y:=0 to barheight-1 do //barheight=32
begin
for x:=0 to barwidth-1 do //barwidth=256
begin
clr:=image.Canvas.Pixels[x,y]; //得到灰度值
r:=GetRValue(clr); //得到红色值
if r>0 then inc(mycount);
Buf[y,x]:=char(r);
end;
end;
end;
//测试点阵是否取值正确
for x:=0 to 31 do
for y:=0 to 255 do
begin
if (buf[x,y]=char(255)) then
Image1.Canvas.Pixels[y,x]:=255;
end;
update;
//发送点阵到LED屏幕
for i:=0 to barscreennum-1 do
begin
for j:=0 to barheight-1 do
begin
for k:=0 to barwidth div 8-1 do
begin
try
//ComPort1.Write(Buf[j,k],2);
ComPort1.Write(Buf[J,K],lenGth(Buf[J,K]));
knum:=(knum+1) mod 128;
if knum=0 then
begin
sleep(40);
end;
except
showmessage('error');
exit;
end;
end;
end;
SHOWMESSAGE('END');
end;
end;
现在就是不能把信息发送到条屏上,也找不到问题出现在那里.这个问题困扰我很久了,,各位高手能不能给找找问题.另条屏是单色的.
1、波特率:9600,8位数据位,无验位,1位停止位
2. 发送信息段格式:开始标志+屏号+日期时间信息+时间显示标志+显示总幕数+方式+显示信息
开始标志(2个字节):0x55,0xaa
屏号(1个字节):0x00-全部, 0x01-1号屏,0x02-2号屏,0x03-3号屏,0x04-4号屏
日期时间(7个字节):year,month,day,hour,min,sec,week
如2003年03月12日10时21分30秒星期四
则时间信息:3、3、12、10、21、30、4(注:星期日为7)
时间显示标志(1个字节)
如果显示时间:标志=0X31
不显示时间:标志=0X30
显示总幕数(1个字节)[barscreennum(0..255幕)]
如果显示总幕数为15数,则barscreennum=15
方式(barscreennum*4个字节,校验位恒为0): 显示方式+消失方式+停留时间+移动速度
for i:=1 to barscreennum do
begin
sendbyte(dispmode); 显示方式(0--11)
sendbyte(hidemode); 消失方式(0--12)
sendbyte(stoptime); 停屏时间(0--255)秒
sendbyte(movespeed); 移动速度(0--9)
end;
注:显示方式:
0-左移入 1-右移入 2-上移入 3-移入 4-左展入 5-右展入
6-上展入 7-下展入 8-横向展开 9-横向闭合
10-纵向展开 11-纵向闭合 12-同时显示
消失方式:
0-左移出 1-右移出 2-上移出 3-移出 4-左展出 5-右展出
6-上展出 7-下展出 8-横向展开 9-横向闭合
10-纵向展开 11-纵向闭合 12-同时消失 13-连续
停留时间:0-255秒
移动速度:0-9,0最快,9最慢
显示信息(barscreennum*ledheight*ledwidth/8个字节,校验位恒为0):
knum:=0;
for i:=1 to barscreennum do
begin
for j:=1 to barheight do //显示屏高:barheight(点)
begin
for k:=1 to barwidth div 8 do //显示屏宽:barwidth/8(点)
begin
sendbyte(sendred[j][k]);
knum:=(knum+1) mod 128;
if knum=0 then delay(40); //每发送128个字节,延迟40ms
end;
end;
end;
//例子
initcom('9600,N,8,1');
delay(1);
sendbyte(0x55);
sendbyte(0xaa);
sendbyte(screenno); //屏号
sendbyte(Year mod 100);
sendbyte(Month);
sendbyte(Day);
sendbyte(Hour);
sendbyte(Min);
sendbyte(Sec);
sendbyte(week);
if disptime=true then sendbyte(0x31)
else sendbyte(0x30);
sendbyte(barscreennum);
for i:=1 to barscreennum do
begin
sendbyte(dispmode);
sendbyte(hidemode);
sendbyte(stoptime);
sendbyte(10*movespeed)
end;
knum:=0;
for i:=0 to barscreennum-1 do
begin
for j:=0 to barheight-1 do
begin
for k:=0 to barwidth div 8-1 do
begin
sendbyte(sendred[j][k]);
knum:=(knum+1) mod 128;
if knum=0 then
begin
delay(40);
end;
end;
end;
end;
主要是通过点阵发送出去.本人写的代码如下:
procedure TForm1.Button4Click(Sender: TObject);
var
i,j,k,x,y,clr,r,g,strcount,knum:integer;
LineBytes,shift,FrameNo,Count,Pos:integer;
TotalBytes:integer;
Buf:array[0..31,0..255] of char;
sendstr:array[0..9] of byte;
mycount:integer;
begin
try
ComPort1.Enabled:=true;
except
end;
for i:=0 to 31 do
for j:=0 to 255 do
begin
buf[i,j]:=char(0);
end;
shift:=$80;
FrameNo:=0; //一直为第一幕
LineBytes:=barwidth div 8;
TotalBytes:=LineBytes * barheight;
Pos:=0;
Count:=0;
r:=0;
g:=0;
shift:=$80;
knum:=0;
if not ComPort1.Connected then
begin
MessageDLG('串口无法初始化,请检查串口连接是否正常.',MtInformation,[mbok],0);
exit;
end;
sendstr[0]:=$55;
sendstr[1]:=$aa;
sendstr[2]:=$01;
sendstr[3]:=$30;
sendstr[4]:=byte(1);
sendstr[5]:=byte(1);
sendstr[6]:=byte(2);
sendstr[7]:=byte(10);
sendstr[8]:=byte(4);
strcount:=length(sendstr);
for i:=0 to strcount-1 do
try
Comport1.WriteStr(chr(sendstr));
except
showmessage('error');
exit;
end;
mycount:=0;
//取到点阵各点的值
for i:=0 to barscreennum-1 do //barscreennum=1 只有一幕
begin
for y:=0 to barheight-1 do //barheight=32
begin
for x:=0 to barwidth-1 do //barwidth=256
begin
clr:=image.Canvas.Pixels[x,y]; //得到灰度值
r:=GetRValue(clr); //得到红色值
if r>0 then inc(mycount);
Buf[y,x]:=char(r);
end;
end;
end;
//测试点阵是否取值正确
for x:=0 to 31 do
for y:=0 to 255 do
begin
if (buf[x,y]=char(255)) then
Image1.Canvas.Pixels[y,x]:=255;
end;
update;
//发送点阵到LED屏幕
for i:=0 to barscreennum-1 do
begin
for j:=0 to barheight-1 do
begin
for k:=0 to barwidth div 8-1 do
begin
try
//ComPort1.Write(Buf[j,k],2);
ComPort1.Write(Buf[J,K],lenGth(Buf[J,K]));
knum:=(knum+1) mod 128;
if knum=0 then
begin
sleep(40);
end;
except
showmessage('error');
exit;
end;
end;
end;
SHOWMESSAGE('END');
end;
end;
现在就是不能把信息发送到条屏上,也找不到问题出现在那里.这个问题困扰我很久了,,各位高手能不能给找找问题.另条屏是单色的.