72

帖子

0

TA的资源

一粒金砂(初级)

21
 
我刚开始接触嵌入式开发半个多月,没有在硬件方面开发的经验,准确说软件开发整体经验不足,属于新手,去年才毕业的,到现在工作时间还差几天才满整一年,与硬件接触作开发这才是第一次,所以,有许多问题不懂,还请各位大虾不吝指教啊
谢谢,^_^

回复

70

帖子

0

TA的资源

一粒金砂(初级)

22
 
    和PC连的那个串口是有一个232转换芯片的。
    和打印机连的串口未必需要232转换芯片。如果打印机是普通CMOS/TTL电平,那么直接与CPU的串口相连是可以的。

    是否用232转换,现在与你没有直接关系。先忽略。


你现在首先必须解决这两个问题:

1. 硬件上必须确认串口的连接是否正常,并且要学会用示波器看串口波形。不然你后续调试串口时,就无法判断板子的串口有没有正确输出信号了。

2. 现在注册表只有COM for USB, IRCom,这两个都不是直接开放给普通程序用的串口。你必须能将其中一个或者这两个之外的另一个串口,加载成普通串口,然后,能在应用层用CreateFile打开,并用串口类对其进行配置(波特率,数据位,停止位,校验,流控等)。

必须能够从应用通过串口发送数据,然后能用示波器在实际板子上测到发出的串口波形,这样你才能继续进行后面的工作。
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

23
 
引用 21 楼 shuiyan 的回复:
你现在首先必须解决这两个问题:

1. 硬件上必须确认串口的连接是否正常,并且要学会用示波器看串口波形。不然你后续调试串口时,就无法判断板子的串口有没有正确输出信号了。

2. 现在注册表只有COM for USB, IRCom,这两个都不是直接开放给普通程序用的串口。你必须能将其中一个或者这两个之外的另一个串口,加载成普通串口,然后,能在应用层用CreateFile打开,并用串口类对其进行配置(波特率,数据位,停止位,校验,流控等)。


请问,对于第二个问题要怎么解决呢?如果,我现在想要用COM3(USB)的口的话,我要怎么做才可以把它加载成为普通串口,然后应用到打印机上呢?是否可以详细说明一下呢?谢谢
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

24
 
up  mark  !!!
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
mark
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

25
 
//  下面的在arm上是调通的,参考一下:

#include "stdafx.h"
#include "CommApp.h"
#include "CommAppDlg.h"
#include "Comm.h"

#include
#include
#include

extern HANDLE hSer;
extern HANDLE g_hevWriteEnable;
//int nLineCount = 0;

extern CEdit *pm_Edit;
extern CEdit *pm_Send;
extern CEdit *pm_Status;

//////////////////////////////////////////////////////////////////////////////////
void CommInit(CString IndexText,unsigned long Baudrate)
{
                DCB dcb;                                                //串口结构
                DWORD x1;                                                //unsigned long (4*8)
                unsigned long x;
                unsigned long *y;
                x= GENERIC_READ | GENERIC_WRITE;

                hSer = CreateFile( IndexText,x, 0,NULL,OPEN_EXISTING, 0, NULL );
                if( hSer == INVALID_HANDLE_VALUE )
                        {
                        pm_Status->SetWindowText(TEXT("Cannot Open COM!"));
                        return;
                        }
                pm_Status->SetWindowText(TEXT("COM Opened!"));
                //set the DCB structure
                dcb.DCBlength = sizeof( DCB );
                GetCommState( hSer, &dcb );
                dcb.fParity = FALSE;
                dcb.fNull = FALSE;
                dcb.StopBits = ONESTOPBIT;
                dcb.Parity = NOPARITY;
                dcb.BaudRate = Baudrate;
                dcb.ByteSize = 8;
//                BOOL bSetCommStat =
                SetCommState( hSer, &dcb );

                //Set the timeout
                COMMTIMEOUTS CommTimeOuts;
                CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF;
                CommTimeOuts.ReadTotalTimeoutMultiplier = 10;
                CommTimeOuts.ReadTotalTimeoutConstant = 10;
                CommTimeOuts.WriteTotalTimeoutMultiplier = 50;
                CommTimeOuts.WriteTotalTimeoutConstant = 100;
                SetCommTimeouts( hSer, &CommTimeOuts );
                return;
}

//Rcv Thread,Read the ComBuffer
void CommRcv(void)
{
        BYTE ReadBuffer[2000] = {0};
//        BOOL bReadStatus = FALSE;
        DWORD dwErrorFlags;
        COMSTAT ComStat;
        DWORD i;
        DWORD dwBytesRead = 0;
        TCHAR TReadBuffer[2000] = {0};
        SetCommMask(hSer,EV_RXCHAR);
        while(1)
                {                       
                WaitCommEvent(hSer,NULL,NULL);
                SetCommMask(hSer,EV_RXCHAR);
                ClearCommError( hSer, &dwErrorFlags, &ComStat );
                if( !ComStat.cbInQue )continue;

//                dwBytesToRead = ComStat.cbInQue;

                if( !ReadFile( hSer,ReadBuffer, ComStat.cbInQue, &dwBytesRead, NULL) )
                        {       
                        pm_Status -> SetWindowText(TEXT("Read COMM Failed!"));
                        return;
                        }
                else
                        {               
                        pm_Status -> SetWindowText(TEXT("Read COM Success!"));

                        MultiByteToWideChar(CP_ACP,0,(char *)ReadBuffer,dwBytesRead,TReadBuffer,dwBytesRead);
                        if(TReadBuffer[0])lstrcat(TReadBuffer,TEXT("\r\n"));

        //                nLineCount = ;
                        if( (pm_Edit->GetLineCount()) > 40)
                                {                               
                                //Clear the Output
                                pm_Edit -> SetSel(0,-1);
                                pm_Edit -> Clear();
                                }
                        //Now output               
                        int nLen = pm_Edit->GetWindowTextLength();
                        pm_Edit -> SetFocus();
                        pm_Edit -> SetSel(nLen, nLen);
                        pm_Edit -> ReplaceSel(TReadBuffer);
                        //Clear the Buffer
                        for(i=0;i < dwBytesRead +2;i++)
                                {
                                ReadBuffer = 0;
                                TReadBuffer = 0;
                                }
                        }       
                }
}

//Trans Thread
void CommTrans(void)
{
        DWORD dwBytes;
        char WBuf[100] = {0};
        TCHAR WriteBuffer[100] = {0};
        while(1)
        {
                if(WaitForSingleObject(g_hevWriteEnable,INFINITE) == WAIT_OBJECT_0)
                        {
                        //Write to Comm
                        pm_Send -> GetWindowText(WriteBuffer,100);
                        lstrcat(WriteBuffer,TEXT("\r\n"));
                        WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK|WC_DEFAULTCHAR,WriteBuffer,lstrlen(WriteBuffer),WBuf,lstrlen(WriteBuffer),NULL,NULL);
                        if(WriteFile(hSer, (TCHAR *)WBuf,lstrlen(WriteBuffer)*sizeof(char),&dwBytes, NULL))
                                pm_Status -> SetWindowText(TEXT("Write COM Success!"));
                        else {
                                DWORD i = GetLastError();
                                pm_Status -> SetWindowText(TEXT("Write COM Failed!"));
                                }
                        }
                else break;
        }
        return;
}


//-----------------------  打开串口命令 -----------

void CCOMMAppDlg::OnButton2()
{
        // TODO: Add your control notification handler code here

        if(!g_bButton1State)
                {
                g_bButton1State = TRUE;
                //Change the Button Caption
                m_ButtonState.SetWindowText(TEXT("Close"));
                //Init COM
                CommInit(CommText,CommBaudRate);

                //Create a thread
                if(!GetExitCodeThread(hRcvThread, &dwTStat)||!GetExitCodeThread(hXmitThread, &dwTStat)||
                                (dwTStat != STILL_ACTIVE))
                        {
                        hRcvThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)CommRcv,NULL,0,&dwTStat);
                        if(hRcvThread)CloseHandle(hRcvThread);

                        hXmitThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)CommTrans,NULL,0,&dwTStat);
                        if(hXmitThread)CloseHandle(hXmitThread);
                        }

                g_hevWriteEnable = CreateEvent(NULL,FALSE,FALSE,NULL);
        //        g_hevReadEnable = CreateEvent(NULL,FALSE,FALSE,NULL);

                }
        else
                {
                g_bButton1State = FALSE;
                //Change the caption
                m_ButtonState.SetWindowText(TEXT("Open"));

                pm_Status->SetWindowText(TEXT("COM Closed!"));
                GetExitCodeThread(hRcvThread, &dwTStat);
                TerminateThread(hRcvThread,dwTStat);

                GetExitCodeThread(hXmitThread, &dwTStat);
                TerminateThread(hXmitThread,dwTStat);

                if(hSer != NULL)  
                        {
                        CloseHandle(hSer);
                        hSer = NULL;
                        }
                }
}
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

26
 
各位大虾,问题多多,先谢过了

现在已确定:大多数外设是直接连接在GPIO上的,并没有通过232的串口,也就是说必须通过GPIO模拟串口通信了,还请各位帮帮忙
在网上找到了控制GPIO的一些资料,可是不很明白具体要怎么控制它,比如说打印机连在GPIO上,我要怎么转换信息来控制各个引脚,又怎么获得数据呢?很不明白……

另:本来想再给帖子加分,可是不允许,如果问题解决我会再发贴,直接给各位加分,谢谢
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

27
 
重新看了一下,发现你有一个描述“只是用了5根线(4蓝一黑)”,如果确实是这样,那么打印机用的可能是带流控的串口,所以你之前的调试才不成功。

有兴趣可以查一下串口协议及接口定义规范,看看CTS/RTS的定义和作用。

具体描述一下接的pin脚位置,9针串口接口是有数字排列的,你在日光下看看那个插槽就知道。

你的程序会运行在WINCE5系统中,不建议用GPIO模拟串口。因为串口是非同步通讯的,对采样时序要求还是挺高的。而操作系统最麻烦的一点就是无法保证线程的精确运作时间,很容易就被别的优先级高的线程给挤掉了。
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

28
 
欲哭无泪了
是呀,之前的板子是暂时给我们用的,现在给了一个比较正式的的硬件集合,一个终端一堆的板子用线直接连在一起,我都不知道怎么形容了
连接了两种磁卡扫描(接触、非接触)的板子,和一个打印机,现在我的任务是搞定流驱动,要求可以直接控制GPIO,说是所有的东西是直接连接在GPIO上的。主板子和这几个外设之间各有一个小板子作为中间桥梁(提问:是做什么用的,回答:可能是做转换用的以便PDA可以使用他们)。
至于打印机,当然还是首要要问题,我看了一下他们的连线,还是五根,不过现在都是白色的,连续在一起,但是看不出来是1-5,还是4-8,打印机上的接口是八个引脚,其他的东西没什么了
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

29
 
想来踩个点~~~~~~
 
 
 

回复

52

帖子

0

TA的资源

一粒金砂(初级)

30
 
学习了,涨知识
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

31
 
学习一下
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表