3883|2

61

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

高分求助,altera的srunner程序中的并口部分如何改成异步串口 [复制链接]

文档是wp_epcs_cyc.pdf和wp_epcs_cyc.zip
下载地址:www.altera.co.jp/literature/wp/wp_epcs_cyc.pdf
www.fulcrum.ru/Read/CDROMs/Altera/literature/wp/

贴下其中的涉及并口下载的部分,如何改成串口的呢,主要是deviceIOcontrol这个函数不知道该怎么解决

bb.c


#include
#include "user.h"

#include "bb.h"


/*////////////////////*/
/* Global Definitions */
/*////////////////////*/
#define        PGDC_IOCTL_GET_DEVICE_INFO_PP        0x00166A00L
#define PGDC_IOCTL_READ_PORT_PP                        0x00166A04L
#define PGDC_IOCTL_WRITE_PORT_PP                0x0016AA08L
#define PGDC_IOCTL_PROCESS_LIST_PP                0x0016AA1CL
#define PGDC_WRITE_PORT                                        0x0a82
#define PGDC_HDLC_NTDRIVER_VERSION                2
#define PORT_IO_BUFFER_SIZE                                256


/*//////////////////*/
/* Global Variables */
/*//////////////////*/
HANDLE        nt_device_handle                = INVALID_HANDLE_VALUE;
int                port_io_buffer_count        = 0;




struct PORT_IO_LIST_STRUCT
{
        USHORT command;
        USHORT data;
} port_io_buffer[PORT_IO_BUFFER_SIZE];

int bb_type = 0;

/* port_data holds the current values of signals for every port. By default, they hold the values in */
/*   reset mode (PM_RESET_). */
/*   port_data[Z], where Z - port number, holds the value of the port. */
int        cur_data = 0x42;/* Initial value for Port 0, 1 and 2 */



int bb_open( void )
{
        int init_ok = 0;        /* Initialization OK */
        int status = 0;

        ULONG buffer[1];
        ULONG returned_length = 0;
        char nt_lpt_str[] = { '\\', '\\', '.', '\\', 'A', 'L', 'T', 'L', 'P', 'T', '1', '\0' };

        nt_device_handle = CreateFile(
                        nt_lpt_str,
                        GENERIC_READ | GENERIC_WRITE,
                        0,
                        NULL,
                        OPEN_EXISTING,
                        FILE_ATTRIBUTE_NORMAL,
                        NULL );

        if ( nt_device_handle == INVALID_HANDLE_VALUE )
        {
                fprintf( stderr, "I/O Error: Cannot open device \"%s\"\n", nt_lpt_str );
                status = CB_BB_OPEN_ERROR_OPEN_PORT;
        }
        else
        {
                if ( DeviceIoControl(
                                nt_device_handle,
                                PGDC_IOCTL_GET_DEVICE_INFO_PP,
                                (ULONG *) NULL,
                                0,
                                &buffer,
                                sizeof(ULONG),
                                &returned_length,
                                NULL ))
                {
                        if ( returned_length == sizeof( ULONG ) )
                        {
                                if (buffer[0] == PGDC_HDLC_NTDRIVER_VERSION)
                                {
                                        init_ok = 1;
                                        fprintf( stdout, "Info: Port \"%s\" opened.\n", nt_lpt_str );
                                }
                                else
                                {
                                        fprintf(stderr,
                                                "I/O Error:  device driver %s is not compatible!\n(Driver version is %lu, expected version %lu.\n",
                                                nt_lpt_str,
                                                (unsigned long) buffer[0],
                                                (unsigned long) PGDC_HDLC_NTDRIVER_VERSION );
                                        status = CB_BB_OPEN_VERSION_INCOMPATIBLE;
                                }
                        }       
                        else
                                fprintf(stderr, "I/O Error:  device driver %s is not compatible!\n", nt_lpt_str);
                                status = CB_BB_OPEN_DRIVER_INCOMPATIBLE;
                }

                if ( !init_ok )
                {
                        fprintf( stderr, "I/O Error: DeviceIoControl not successful!" );
                        CloseHandle( nt_device_handle );
                        nt_device_handle = INVALID_HANDLE_VALUE;
                        status = CB_BB_OPEN_DEVICEIOCONTROL_FAIL;
                }
        }

        if ( !init_ok )
        {
                fprintf( stderr, "Error: Driver initialization fail!\n" );
                CloseHandle( nt_device_handle );
                nt_device_handle = INVALID_HANDLE_VALUE;
                return status;
        }
        else
        {
                status = bb_verify( &bb_type );
                if ( status != CB_OK )
                {
                        CloseHandle( nt_device_handle );
                        nt_device_handle = INVALID_HANDLE_VALUE;
                        return status;
                }
                else
                {
                        if ( bb_type == 1 )
                                status = bb_reset( BBMV_CONFIG_MODE );
                        else if ( bb_type == 2)
                                status = bb_reset( BBII_CONFIG_MODE );
                       
                        return status;
                }
        }
}



int bb_close( void )
{
        int status = 0;
       
        if ( bb_type == BBNONE )
        {
                fprintf(stderr, "ByteBlaster not opened!");
                return CB_BB_CLOSE_BYTEBLASTER_NOT_OPEN;
        }
        else
        {
                if ( bb_type == BBMV )
                        status = bb_reset( BBMV_USER_MODE );
                else if ( bb_type == BBII)
                        status = bb_reset( BBII_USER_MODE );
               
                if ( status == CB_OK )
                        bb_type = BBNONE;
                return status;
        }
       
        CloseHandle( nt_device_handle );
        nt_device_handle = INVALID_HANDLE_VALUE;
}



int bb_flush( void )
{
        ULONG n_writes = 0L;
        BOOL status;

        status = DeviceIoControl(
                nt_device_handle,                        /* handle to device */
                PGDC_IOCTL_PROCESS_LIST_PP,        /* IO control code */
                (LPVOID)port_io_buffer,                /* IN buffer (list buffer) */
                port_io_buffer_count * sizeof(struct PORT_IO_LIST_STRUCT),/* length of IN buffer in bytes */
                (LPVOID)port_io_buffer,        /* OUT buffer (list buffer) */
                port_io_buffer_count * sizeof(struct PORT_IO_LIST_STRUCT),/* length of OUT buffer in bytes */
                &n_writes,                                        /* number of writes performed */
                0);                                                        /* wait for operation to complete */

        if ((!status) || ((port_io_buffer_count * sizeof(struct PORT_IO_LIST_STRUCT)) != n_writes))
        {
                fprintf(stderr, "I/O Error:  Cannot flush ByteBlaster hardware!\n");
                return CB_BB_FLUSH_ERROR;
        }
        else
        {
                port_io_buffer_count = 0;
                return CB_OK;
        }
}



                                                                       
int bb_lptread( int port, int *data )
{
        int temp = 0;
        int status = 0;
        int returned_length = 0;

        status = DeviceIoControl(
                        nt_device_handle,                        /* Handle to device */
                        PGDC_IOCTL_READ_PORT_PP,        /* IO Control code for Read */
                        (ULONG *)&port,                                /* Buffer to driver. */
                        sizeof(int),                                /* Length of buffer in bytes. */
                        (ULONG *)&temp,                                /* Buffer from driver. */
                        sizeof(int),                                /* Length of buffer in bytes. */
                        (ULONG *)&returned_length,        /* Bytes placed in data_buffer. */
                        NULL);                                                /* Wait for operation to complete */

        if ((!status) || (returned_length != sizeof(int)))
        {
                fprintf(stderr, "I/O error:  Cannot read from ByteBlaster hardware!\n");
                return CB_BB_LPTREAD_ERROR;
        }
        else
        {
                *data = temp & 0xff;
                return CB_OK;
        }
}

int bb_lptwrite( int port, int data, int nbuffering )
{
        int status = 0;
        int returned_length = 0;
        int buffer[2];

        /* Collect up to [PORT_IO_BUFFER_SIZE] data for Port0, then flush them */
        /* if nbuffering = 1 or Port = 1 or Port = 2, writing to the ports are done immediately */
        if (port == 0 && nbuffering == 0)
        {
                port_io_buffer[port_io_buffer_count].data = (USHORT) data;
                port_io_buffer[port_io_buffer_count].command = PGDC_WRITE_PORT;
                ++port_io_buffer_count;

                if (port_io_buffer_count >= PORT_IO_BUFFER_SIZE) bb_flush();
        }
        else
        {
                buffer[0] = port;
                buffer[1] = data;

                status = DeviceIoControl(
                                nt_device_handle,                        /* Handle to device */
                                PGDC_IOCTL_WRITE_PORT_PP,        /* IO Control code for write */
                                (ULONG *)&buffer,                        /* Buffer to driver. */
                                2 * sizeof(int),                        /* Length of buffer in bytes. */
                                (ULONG *)NULL,                                /* Buffer from driver.  Not used. */
                                0,                                                        /* Length of buffer in bytes. */
                                (ULONG *)&returned_length,        /* Bytes returned.  Should be zero. */
                                NULL);                                                /* Wait for operation to complete */
               
                if ( !status )
                {
                        fprintf(stderr, "I/O error:  Cannot write to ByteBlaster hardware!\n");
                        return CB_BB_LPTWRITE_ERROR;
                }
        }
        return CB_OK;
}



int bb_read( int signal, int *data )
{
        int temp = 0;
        int        status = 0;

        status = bb_lptread( LPT_STATUS, &temp );
        if ( status == CB_OK )
                *data = (temp ^ 0x80) & signal;
        return status;
}

int bb_write( int signal, int data )
{
        int status = 0;

        /* AND signal bit with '0', then OR with [data] */
        int mask = ~signal;

        cur_data = ( cur_data & mask ) | ( data * signal );
        status = bb_lptwrite( LPT_DATA, cur_data, 0 );
        return status;
}


int bb_reset( int mode )
{
        int status = 0;

        /* write to Port 0 and Port 2 with predefined values */
        int control = mode ? 0x0C : 0x0E;
        cur_data = 0x42;       
       

        status = bb_lptwrite( LPT_DATA, cur_data, 1 );
        if ( status == CB_OK )
                status = bb_lptwrite( LPT_CONTROL, control, 1 );
        return status;
}



最新回复

用CreateFile函数打开串口设备就可以了  详情 回复 发表于 2009-10-28 18:19
点赞 关注

回复
举报

62

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
不要看他原来的并口代码,没用
自己写一个串口接受函数来接受

初始化串口
定义接受发送函数

 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
用CreateFile函数打开串口设备就可以了
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表