页次: 1
谢谢晕哥指导:-)
我现在移植一个单片机程序到Linux下,主要是操作一个串口模块进行操作,需要在发送AT命令数据后读取串口接收,并且也要一直监听串口去读取透传过来的数据。
在单片机中,是通过串口接收中断实现的,每一位数据都存放在一个buf中。只要每次发送AT后等待一段时间即可。
现在在Linux下,我本来是想每次串口发送结束后,去read串口。但是这样的话感觉要实现一个长时间的监听透传的数据不太好。或者有好的,但我不知道。。。
现在我是准备开一个线程,去模拟串口接收中断,我在想是写无限阻塞读取1位,还是每次读取的位数多一些比较好?
或者有没有更好的实现方式,大佬们提点一下;-)
最近买了个orangepi,他有armbian官方的源.但是还是有些东西没有,我想在我的板子上移植一个新版本的bluez.
因为编译bulez需要先编译5个依赖,所以我感觉非常麻烦,这时候我发现板子apt-get可以获取到对应的一些依赖(头文件以及lib),
比如Glib,他的lib文件就会存放在/usr/lib/aarch64-linux-gnu中.
但是我的主机如果apt-get对应的依赖库,默认是存放在/usr/lib/x86_64-linux-gnu/中的.
我的交叉编译器是解压安装的,编译的时候需要将库放到~/GccOrangPi/aarch64-linux-gnu/libc/lib/
我现在有什么办法可以直接get到板子上交叉编译器对应的lib,然后存放到我本机交叉编译器的库地址?
1,刚翻了一下1306的资料,看起来是支持400k的速度的,楼主先用示波器抓一下现有的iic波形,看系统输出有没有异常(sclk周期,波形),若波形不好添加上拉电阻试试。
2,通常芯片的linux驱动里面默认应该都是400k,具体能不能通过dts来改,还是建议源码里面具体的驱动实现(这里面经常有坑的)
3,另外楼主用的芯片是什么型号?最好翻一下其寄存器看能否支持速度调整
我用的芯片是V3S,上拉电阻我使用的是10K。
我也觉得这个芯片应该是支持400Khz的速度,因为我找了些STM32硬件I2c的程序,他们设置的就是400Khz速率,可以正常通信。
但是我相同的接口去连接mpu6050可以直接读写,说明芯片I2c是正常工作的,这就让我摸不着头脑了。
一.问题1
我想在linux应用层中操作/dev/i2c-0,来驱动4线IIC OLED,OLED驱动芯片为SSD1306。
首先我想使用<linux/i2c-dev.h>中的i2c_smbus协议来对模块进行读写,我初始化完成后,使用
int setI2CSlave(int fd, int slave)
{
if (ioctl(fd, I2C_SLAVE, slave) < 0)
{
errMsg("Fail ioctl I2C_SLAVE");
return -1;
}
return 0;
}
设置从机地址没有报错。但是当我使用
/**
* @brief WriteCmd,向OLED写入命令
* @param fd:文件句柄 I2C_Command:命令代码
* @retval 无
*/
void WriteCmd(int fd,unsigned char I2C_Command)//写命令
{
I2CWriteByteTo(fd,0x00,I2C_Command,0);
}
int I2CWriteByteTo(int fd, int pos, unsigned char byteData, int wait_ms)
{
if (i2c_smbus_write_byte_data(fd, (unsigned char)pos, (unsigned char)byteData) < 0)
{
errMsg("Fail to I2CWriteByteTo");
return -1;
}
usleep(1000 * wait_ms);
return 0;
}
时,就会出现ERROR [ETIMEDOUT Connection timed out] Fail to I2CWriteByteTo的错误。
当我换了一个mpu6050,我设置好地址对其进行读写,可以正常操作mpu6050.
我怀疑是oled不支持现在这个i2c速率,那么我应该怎样才能在应用层修改i2c设备速率呢?或者是别的问题?
二.问题2
后来我移植了gpio模拟i2c来进行读写。是可以读写的。但是速度有限,问题在这里
struct timespec delay = {0, 1};
///**********************************************
//// 通过I2C总线写一个字节
//**********************************************/
void OLED_Write_Byte(uint8_t IIC_Byte)
{
uint8_t i;
IIC_SCL_LOW();
for (i = 0; i < 8; i++)
{
if ((IIC_Byte & 0x80) >> 7)
IIC_SDA_HIGH();
else
IIC_SDA_LOW();
IIC_Byte <<= 1;
IIC_SCL_HIGH();
IIC_SCL_LOW();
nanosleep(&delay,NULL);//本来没有的延时
}
}
我每次拉低时钟之后都要延时一下,哪怕现在只有1nm。我用stm32刷屏都是秒刷,现在刷屏我还要等1秒左右,非常蛋疼。
请教各位这两个问题该如何解决?谢谢大家了。
1.问题描述
我在qt中写了一个程序,在v3s中读取gps数据并对其进行处理。我在qt上已经搭建好了交叉编译环境以及目标板配置。并且之前测试了几个小程序,都可以点击运行并且在qt的输出栏中查看程序输出。
但是这个程序有所区别,我在qt中执行会出现如下现象
然后我用普通ssh软件登录进去之后,执行该程序,是这个结果是
现在发现问题是检测打开的文件是否是串口时发生错误。
接下来我找到了出错的代码段:
int UART_Open(int fd,char* port)
{
fd = open( port, O_RDWR|O_NOCTTY|O_NDELAY);//非阻塞,读写,无流控
if (FALSE == fd)
{
perror("Can't Open Serial Port");
return(FALSE);
}
//恢复串口为阻塞状态
if(fcntl(fd, F_SETFL, 0) < 0)
{
printf("fcntl failed!\n");
return(FALSE);
}
else
{
printf("fcntl=%d\n",fcntl(fd, F_SETFL,0));
}
//测试是否为终端设备
if(0 == isatty(STDIN_FILENO))//**********此处为出错代码段**************
{
printf("standard input is not a terminal device\n");
return(FALSE);
}
else
{
printf("isatty success!\n");
}
printf("fd->open=%d\n",fd);
return fd;
}
目前我的程序就是主程序进入后立即打开串口,我实在想不通为何用qt启动和别的ssh软件登录启动会导致isatty函数返回值出现不同?请大家不吝赐教。
以下是我的qt远程主机配置
我想用v3s解析gps数据。本来想得是可以读取到换行符停止。但是目前的现象是一串数据过来,比如45个字节,我串口接收到就变成长度32和13的两个数据。
例如我发送$GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30
接受到的信息如下
# ./uartRec
fcntl=0
isatty success!
fd->open=3
Receive 32
Receice 11
我的串口接收线程如下
static void *threadRead(void *arg)//串口读取线程
{
while(1)
{
bufflen=UART_Recv(uartfd,RecvBuff,150);
if(bufflen>0)
{
SendBuff=(char *)malloc(bufflen);
memcpy(SendBuff,RecvBuff,bufflen);
printf("Receive %d\n",bufflen);
free(SendBuff);
}
usleep(1000);
}
return NULL;
}
串口接受程序如下
int UART_Recv(int fd, char *rcv_buf,int data_len)
{
int len,fs_sel;
fd_set fs_read;
struct timeval time;
FD_ZERO(&fs_read);
FD_SET(fd,&fs_read);
time.tv_sec = 10;//等待时间 秒
time.tv_usec = 0;//等待时间 微妙
//使用select实现串口的多路通信
fs_sel = select(fd+1,&fs_read,NULL,NULL,&time);
//printf("fs_sel = %d\n",fs_sel);
if(fs_sel)
{
len = read(fd,rcv_buf,data_len);
//printf("len = %d fs_sel = %d\n",len,fs_sel);
return len;
}
else
{
//printf("Sorry,I am wrong!");
return FALSE;
}
}
请大家给些指点,或者给个思路怎样在一次只接收32字节的情况下解析gps。。。
我按照网上交叉编译的教程,到了
交叉编译openssh
/***以下为教程*****/
编译openssh会引用上面编译的zlib和openssl的安装目录,如下。
$ cd ../openssh-6.6p1
$ ./configure --host=arm-none-linux-gnueabi --with-libs --with-zlib=/home/veryarm/ssh/zlib.install --with-ssl-dir=/home/veryarm/ssh/openssl.install --disable-etc-default-login CC=arm-none-linux-gnueabi-gcc AR=arm-none-linux-gnueabi-ar
$ make
/***以下我的命令****/
./configure --host=arm-linux-gnueabihf --with-libs --with-zlib=/home/zqh/ssh/zlib.install --with-ssl-dir=/home/zqh/ssh/openssl.install --disable-etc-default-login CC=arm-linux-gnueabihf-gcc AR=arm-linux-gnueabihf-ar
报错为
configure: warning: CC=arm-linux-gnueabihf-gcc: invalid host type
configure: warning: AR=arm-linux-gnueabihf-ar./configure: invalid host type
configure: error: can only configure for one host and one target at a time
这个错误该如何解决,本人刚接触linux,求助.....
页次: 1