搜索
bottom↓
回复: 16

VB做的上位机,出错了,请帮助一下,在线等待【恢复】

[复制链接]

出0入0汤圆

发表于 2008-10-27 11:16:02 | 显示全部楼层 |阅读模式
这是我写的单片机的程序:

#include<reg52.h>

char c='8';

sbit P1_0=P1^0;

void com_initialize(void)

{ 

 



  TMOD |=0x20;   //设置定时器T/C1工作在方式2,定时1工作于自动重载模式

  SCON=0x50;     //设置串行口工作方式1:SCON格式 |M0|M1|M2|REN|TB8|RB8|TI|RI

  TH1=0xfd;      //波特率9600

  TL1=0xfd;

  TR1=1;  

  ET1=1;       //启动定时器

  ES=1;                //开串行口中断

  EA=1;

} 

void stop() interrupt 4

{

        

        if(RI==1)

        {

                c=SBUF;

                RI=0;

                

        }

}   



void main()

{

        

        com_initialize();

        P1=0xff;

        while(1)

        {

                if(c!='8') 

                {        switch(c)

                        {

                        case '1': 

                                P1_0=0;break;

                        case '2':

                                P1_0=1;break;

                                

                        }

                }



        }

        

}

  

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2009-1-6 20:17:49 | 显示全部楼层
我用的是文本形式发送的,9楼的看我写的程序了没,我那个mscomm.output='1'这样写对吗?

如果发“1”,单片机收到的是49,‘1’我没试过。前段时间正好做过遇到跟你一样的问题,后来用串口调试试了下,你发的字符,单片机收到的是你发的字符的ASCII码值。

出10入0汤圆

发表于 2008-11-15 16:00:29 | 显示全部楼层
14楼应该是对的



我的程序中这样是可以的



Private Sub Command5_Click()

Dim p_mid As Single

Dim temp_str(2) As Byte

Dim buffer As Variant

If sw Then

    If (Text3.Text = "" And Text4.Text = "") Or (Text3.Text = "" And Text4.Text <> "") Then

         ret = MsgBox("请先输入测试数据", 64, "出错了")

        Text3.SetFocus

    Else

        p_mid = ((Str(Text3.Text)) / P_DEF) * 255

        temp_str(0) = CByte(p_mid)    'P 发送的时候先发送数组下标小的那个

        temp_str(1) = CByte(&H11)

        temp_str(2) = CByte(temp_str(0)) Xor CByte(temp_str(1))

        '"&h" & hex(str(60))    连接生成十六进制格式

        S_DATA_X = Str(Text3.Text)

        buffer = temp_str     '经chr转换后的数据已经是字符代表的 Ascii码值,如97就是代表 a

        MSComm1.Output = buffer

    End If

Else

    ret = MsgBox("请先打开串口", 64, "出错了")

End If

End Sub

出0入0汤圆

发表于 2008-11-9 17:15:39 | 显示全部楼层
看一看如果用串口调试助手看到接收的是31,那么看一下你的单片机程序里判断接收到的比较值是否也是0x31,如下面开关语句:

switch (q)

  {

  case 0x31: PORTB.1=1; break;//二极管亮

  case 0x32: PORTB.1=0; break;//二极管灭

  default: break;

  }

上面的0x32对应VB程序里的MSComm1.Output="2"

如果采用以下VB写法:

Dim j(0) As Byte

------------------

j(0) = &H1             '发十六进制hex数

MSComm1.Output = j

那么单片机程序只要象识别其他十六进制数一样把串口读来二进制判别-控制,比较直观。

出0入0汤圆

发表于 2008-10-27 12:54:50 | 显示全部楼层
看了下你的VB代码,好你发的不是mscomm.output='1'而是 MSComm1.Output = "1" 

出0入22汤圆

发表于 2008-10-27 12:50:26 | 显示全部楼层
1.确定是否vb已经将你需要的东西发送出去了?

2.确定vb发送的东西是你需要的东西?

3.确定单片机已经收到了你发送过来的东西?

4.确定你单片机接收到的东西以及处理的东西和你发的东西一样?(比如别吧‘1’,搞成了1)

5.检查其他乱七八糟的东西,比如比特率,连线,RP值等,呵呵。。。

出0入0汤圆

发表于 2008-10-27 12:49:12 | 显示全部楼层
看了你的单片机是文本的,应该没错,你还是先用串口调试调通了再用VB做上位机试下.

出0入0汤圆

 楼主| 发表于 2008-10-27 12:27:42 | 显示全部楼层
我用的是文本形式发送的,9楼的看我写的程序了没,我那个mscomm.output='1'这样写对吗?

出0入0汤圆

发表于 2008-10-27 12:20:44 | 显示全部楼层
用串口调试助手试下,VB发的时候,是用二进制发的吗.发的数据如果是二进制的话是需要通过数组发出去的.

出0入0汤圆

 楼主| 发表于 2008-10-27 12:14:04 | 显示全部楼层
波特率也没错

出0入0汤圆

 楼主| 发表于 2008-10-27 12:11:48 | 显示全部楼层
就是我想让P1_0亮,但是没有反应

出0入0汤圆

发表于 2008-10-27 12:09:52 | 显示全部楼层
上下位的波特率对吗

出0入22汤圆

发表于 2008-10-27 12:09:32 | 显示全部楼层
你应该描述下出了啥样的错误,你让大家读你的代码,然后揣测出了啥错误,然后根据这个揣测来告诉你如何解决?

简直跟猜谜一般。

出0入0汤圆

 楼主| 发表于 2008-10-27 11:50:09 | 显示全部楼层
vb用的网上下的,请作者不要介意

出0入0汤圆

 楼主| 发表于 2008-10-27 11:49:35 | 显示全部楼层
Private Sub Combo1_Change()

Dim i As Byte

If MSComm1.PortOpen = True Then

  MSComm1.PortOpen = False

  i = 1

Else

  i = 2

End If

MSComm1.CommPort = Combo1.Text

If i = 1 Then

  MSComm1.PortOpen = True

Else

End If

End Sub



Private Sub Combo1_Click()

Dim i As Byte

If MSComm1.PortOpen = True Then

  MSComm1.PortOpen = False

  i = 1

Else

  i = 2

End If

MSComm1.CommPort = Combo1.Text

If i = 1 Then

  MSComm1.PortOpen = True

Else

End If



End Sub





Private Sub Command1_Click() '(第1个二极管)按钮单击事件

If MSComm1.PortOpen = False Then

  Label1.Caption = "您的串口现在是关闭状态,请先打开串口"

Else

  Label1.Caption = ""

  If Shape1.BackColor = &H808080 Then

    Shape1.BackColor = &HC000&

    Command1.Caption = "关"

    MSComm1.Output = "1"

  Else

    Shape1.BackColor = &H808080

    Command1.Caption = "开"

    MSComm1.Output = "2"

  End If

End If



End Sub



Private Sub Command2_Click() '(第2个二极管)按钮单击事件

If MSComm1.PortOpen = False Then

  Label1.Caption = "您的串口现在是关闭状态,请先打开串口"

Else

  Label1.Caption = ""

  If Shape2.BackColor = &H808080 Then

    Shape2.BackColor = &HC000&

    Command2.Caption = "关"

    MSComm1.Output = "3"

  Else

    Shape2.BackColor = &H808080

    Command2.Caption = "开"

    MSComm1.Output = "4"

  End If

End If



End Sub



Private Sub Command3_Click() '(第3个二极管)按钮单击事件

If MSComm1.PortOpen = False Then

  Label1.Caption = "您的串口现在是关闭状态,请先打开串口"

Else

  Label1.Caption = ""

  If Shape3.BackColor = &H808080 Then

    Shape3.BackColor = &H80FF&

    Command3.Caption = "关"

    MSComm1.Output = "5"

  Else

    Shape3.BackColor = &H808080

    Command3.Caption = "开"

    MSComm1.Output = "6"

  End If

End If



End Sub



Private Sub Command4_Click() '(第4个二极管)按钮单击事件

If MSComm1.PortOpen = False Then

  Label1.Caption = "您的串口现在是关闭状态,请先打开串口"

Else

  Label1.Caption = ""

  If Shape4.BackColor = &H808080 Then

    Shape4.BackColor = &HFF0000

    Command4.Caption = "关"

    MSComm1.Output = "7"

  Else

    Shape4.BackColor = &H808080

    Command4.Caption = "开"

    MSComm1.Output = "8"

  End If

End If



End Sub



Private Sub Command6_Click() '(设置串口的端口号)按钮单击事件

If MSComm1.PortOpen = True Then

  MSComm1.PortOpen = False

Else

End If

MSComm1.CommPort = Text2.Text

MSComm1.PortOpen = True



End Sub



Private Sub Form_Load() '初始化

MSComm1.CommPort = Combo1.Text

MSComm1.Settings = "19200,n,8,1"

If MSComm1.PortOpen = True Then

  MSComm1.PortOpen = False

Else

End If

Command5.Caption = "打开"

Label2.Caption = "关"

Label2.ForeColor = &HFF&

End Sub





Private Sub Command5_Click() '(控制串口的开与关)按钮单击事件

If MSComm1.PortOpen = True Then

  Command5.Caption = "打开"

  MSComm1.PortOpen = False

  Label2.Caption = "关"

  Label2.ForeColor = &HFF&

Else

  Command5.Caption = "关闭"

  MSComm1.PortOpen = True

  Label2.Caption = "开"

  Label2.ForeColor = &H8000&

End If



End Sub



Private Sub Frame2_DragDrop(Source As Control, X As Single, Y As Single)



End Sub

出0入0汤圆

 楼主| 发表于 2008-10-27 11:19:15 | 显示全部楼层
如果有必要的话,我可以把VB程序也发一下

出0入0汤圆

 楼主| 发表于 2008-10-27 11:17:16 | 显示全部楼层
我就想通过VB做的上位机,通过PC发送一个字符节1然后,一个led亮,VB程序中我是这样写的 MSComm1.Output = "1"
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 16:45

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表